2010-09-08 4 views
2

que je voulais faire un insert dans une union, et quelqu'un a suggéré ceci:Que signifie cet ONU?

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

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

Note: 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, donc c'est un alias, mais pourquoi est-ce nécessaire pour que ça marche? Si je l'enlève, il ne s'exécutera pas.

+0

Soyez spécifique. Exactement quelle erreur obtenez-vous quand il "ne sera pas exécuté"? –

Répondre

10

Ce n'est pas un mot-clé. C'est un alias. N'importe quelle chaîne aurait pu être utilisée à la place de "UN".

sous une forme plus complète, il est:

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

@Tomalak est correcte. Dans ce cas, l'alias est requis. Sans l'alias, l'erreur est:

Msg 102, niveau 15, état 1, ligne 2 syntaxe incorrecte près ')'.

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

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

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 
+0

Une idée de pourquoi c'est nécessaire? Si je n'ajoute pas l'alias, il ne s'exécutera pas. –

+0

Il n'est pas nécessaire en général. Il pourrait être référencé par une autre partie de la requête, c'est tout. –

+0

Pour mysql c'est nécessaire, vous devez donner des alias aux tables si elles proviennent d'une sous-requête. Mais je ne pense pas que SQLServer a la même exigence. – Malfist

3

Il s'agit d'un alias dans ce contexte. Il n'y a pas de commande T-SQL un. 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

Dans ce cas, UN est l'alias du jeu de résultats de la sous-requête (le (SELECT x FROM y UNION ALL SELECT x FROM z)). Vous pouvez remplacer UN par ce que vous voulez tant que cela ne va pas perturber l'analyseur.

1

Tout ce qui fait est alias le (SELECT x FROM y UNION ALL SELECT x FROM z) "UN"

0

Un nom alias/corrélation donne le résultat définir un nom temporaire afin qu'il puisse être référencé ailleurs dans la requête. Cet exemple montre que l'alias doit pouvoir référencer les champs des sous-requêtes dans les clauses select et join. Si les sous-requêtes n'ont pas d'alias, le serveur ne saura pas de quelle table obtenir 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 
4

Il est nécessaire car il s'agit d'une table dérivée et les tables dérivées doivent avoir un nom. Cela ne fonctionnera-t-il pas? Je ne vois pas que vous avez besoin de la table dérivée.J'ai changé à une table temporaire car les globaux 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 d'utiliser les tables temporaires gloabl.