/ / Que signifie cette ONU? - sql-server, tsql

Que veut dire cette ONU? - sql-server, tsql

Je voulais faire une insertion avec un syndicat, et quelqu'un a suggéré ceci:

SELECT x INTO ##temp
FROM (SELECT x FROM y UNION ALL SELECT x FROM z) UN

Cela fonctionne, mais quel est le UN? Malheureusement, googler pour "t-sql un" n'est pas très utile: p

Remarque: j'ai découvert que vous pouvez simplement faire SELECT x INTO ##temp FROM y UNION ALL SELECT x FROM b mais je suis toujours curieux de savoir UN.

EDIT: Ok, c’est donc un alias, mais pourquoi faut-il que cela fonctionne? Si je le supprime, il ne sera pas exécuté.

Réponses:

10 pour la réponse № 1

Ce n'est pas un mot clé. C'est un alias. N'importe quelle chaîne aurait pu être utilisée ici au lieu de "UN".

En forme plus complète, c'est:

SELECT x INTO ##temp
FROM (SELECT x FROM y UNION ALL SELECT x FROM z) AS UN

@Tomalak est correct. Dans ce cas, l'alias est requis. Sans l'alias, l'erreur est la suivante:

Msg 102, Niveau 15, Etat 1, Ligne 2 Syntaxe incorrecte près de ")".

J'ai un peu simplifié la requête et utilisé la base de données AdventureWorks:

SELECT * INTO ##temp
FROM (SELECT * FROM Person.Address)

cela reçoit l'erreur ci-dessus. En revanche:

SELECT * INTO ##temp
FROM Person.Address

fonctionne très bien. Une alternative est

;WITH UN AS
(
SELECT * FROM Person.Address
)
SELECT * INTO ##temp
FROM UN

4 pour la réponse № 2

Il est nécessaire car il s’agit d’une table dérivée et les tables dérivées doivent avoir un nom. Won "t ce travail? Je ne vois pas que vous avez besoin de la table dérivée.

SELECT x
INTO #Temp
FROM y
UNION ALL
SELECT x
FROM z

J'ai changé pour une table temporaire régulière car les tables globales sont généralement une mauvaise idée, car une autre connexion peut les affecter. Si vous en avez vraiment besoin, utilisez-le, sinon faites très attention à ne pas utiliser de tables de temp globales.


3 pour la réponse № 3

C'est un alias dans ce contexte. Il n'y a pas un Commande T-SQL. Vous pouvez ensuite référencer vos champs avec cela.

SELECT un.x INTO ##temp
FROM (SELECT x FROM y UNION ALL SELECT x FROM z) UN

1 pour la réponse № 4

Dans ce cas, UN est le pseudonyme de l'ensemble de résultats de la sous-requête (le (SELECT x FROM y UNION ALL SELECT x FROM z)). Vous pouvez remplacer UN avec ce que vous voulez tant que cela ne va pas dérouter l’analyseur.


1 pour la réponse № 5

Tout ce que cela fait est alias (SELECT x FROM UNION ALL SELECT x FROM z) à "UN"


0 pour la réponse № 6

Un nom d'alias / corrélation donne au jeu de résultats unenom temporaire afin qu'il puisse être référencé ailleurs dans la requête. Cet exemple montre que l'alias est requis pour pouvoir référencer les champs des sous-requêtes dans les clauses select et join. Si les sous-requêtes ne comportaient pas d'alias, le serveur ne saurait pas quelle table extraire le champ "y". Les alias sont nécessaires pour distinguer les deux rôles différents des sous-requêtes.

select A.*, B.y
from
(select id, f, k, y from Table1) A
join
(select id, t, y, s from Table2) B
on A.id = B.id