2009-09-15 12 views
57

J'essaie de tracer un peu de SQL dans Microsoft Server. Je suis tombé sur une jointure qui utilise une convention qui m'est inconnue. Que signifie "=*"?Que signifie = *?

WHERE table1.yr =* table2.yr -1 
+47

cela signifie: réécrire moi avec la nouvelle syntaxe sql! –

+5

Si vous êtes assez vieux pour vous souvenir de la syntaxe ... –

+31

il vous envoie un baiser –

Répondre

71

Ce:

WHERE t.column =* s.column 

... est ancienne syntaxe de jointure externe TSQL (avant SQL Server 2005) et n'est pas une jointure ANSI.

Référence: SQL Server 2005 Outer Join Gotcha

+10

Techniquement, il est pré SQL Server 7. – Dave

+1

En outre, à partir de SQL Server 2012, vous ne pouvez pas utiliser cette syntaxe, car ils ont abandonné Mode de compatibilité de la version 80. C'est une bonne chose –

16

Ceci est l'ancienne syntaxe de style pour exprimer rejoint

+2

Quelqu'un est rep faim ... –

+2

@victor hugo Je suis toujours un débutant à ce sujet, s'il vous plaît soyez aimable. Honnêtement, je doublais celui-ci en premier, essayant simplement d'aider. Le plus drôle, et j'ai découvert cela accidentellement, c'est que nous avons plus de représentants pour ces non-brainers que pour des questions beaucoup plus difficiles. BTW pourquoi vous tease _me_ à ce sujet, par rapport aux répondants plus tard avec un plus haut rep/plus longue adhésion SO? – mjv

+0

@mjv: Je pense que Vitor me taquine en fait. –

25

Je crois que est ancienne syntaxe indiquant une condition de jointure externe de table1 à table2

Ancien:

SELECT * FROM table1, table2 
WHERE table1.yr =* table2.yr -1 

Nouveau style (SQL92):

SELECT * FROM table2 
LEFT OUTER JOIN table1 ON table1.yr = table2.yr - 1 
+2

En fait ton exemple n'est pas correct. Si vous voulez vraiment utiliser une jointure externe gauche, ce serait SELECT * FROM ** table2 ** LEFT OUTER JOIN ** table1 ** sur table1.yr = table2.yr-1 – Turismo

+0

@Turismo - bonne prise! édité ma réponse pour corriger cela. –

1

A ??? La jointure externe est spécifiée en utilisant le symbole = * à la place de = dans la clause WHERE.

+0

Arrête de me descendre, étoile sur la DROITE signifie que ce côté peut contenir des zéros. C'est la jointure extérieure gauche. – alex

+0

La question "Est-ce * = a GAUCHE ou DROITE jointure externe" ne peut pas répondre, parce que vous pouvez écrire soit DE A, B AC * = Bc ou FROM A, B * = ON Bc Ac Même opérateur (* =), mais l'un est une jointure externe GAUCHE et l'autre est une jointure externe DROITE. Néanmoins, je pense que vous avez tort, et le * va sur le côté de la colonne de la table extérieure, pas la table intérieure. La morale de l'argument est que c'est une syntaxe horrible. J'aime mieux la réponse de HLGEM. –

+0

Je peux vous dire de l'essayer réellement (et le garçon était-il difficile d'écrire cette syntaxe, shudder) que * = est la jointure gauche. Merci pour les mots gentils Steve. – HLGEM

2

Il s'agit de l'ancien style de jointure qui était obsolète dans ANSI SQL92. La nouvelle syntaxe utilise et INNER OUTER JOIN qui se rejoignent tables basées sur des expressions plutôt que l'égalité

0

Yeap, il est une autre syntaxe pour une jointure externe gauche

 
from 
table1 left outer join table2 on table1.yr = table2.yr - 1 
+0

et c'est aussi une autre syntaxe pour une jointure externe droite : à partir table2 jointure externe droite table1 sur table1.yr = table2.yr - 1 –

11

Cela signifie que le code doit être remplacé immédiatement! Cette jointure de style est supposée être une bonne jointure. Malheureusement, il sera parfois interprété comme une jointure croisée, donc les résultats de l'utilisation de cette jointure peuvent ne pas être corrects. De plus, cette syntaxe est obsolète et ne peut pas être utilisée dans la prochaine version du serveur SQl.

+4

Pour ceux qui ont downvoted cela, je l'ai dit parce que le Le code actuel est incorrect par tout standard car les résultats corrects ne peuvent pas être garantis même depuis SQL Server 2000. Il indique même que ce code a des résultats incohérents dans la documentation en ligne pour SQL Server 2000.Pour le laisser est la base de code serait risqué et non professionnel. – HLGEM

-1

Il y a beaucoup de réponses stupides ici. Vous n'avez pas donné la clause FROM, il n'y a donc aucun moyen de dire si votre * = représente une jointure extérieure GAUCHE ou DROITE.

WHERE table1.yr =* table2.yr -1 

est l'ancienne syntaxe pour une jointure externe, c'est certain. Mais quiconque prétend savoir s'il s'agit d'une jointure externe GAUCHE ou DROITE se trompe. Cela dépend de l'ordre dans lequel table1 et table2 sont nommés dans la clause FROM, et cela n'est pas donné.

+0

Non. Le * indique quelle table est conservée. Dans cet exemple, la table2 est conservée. – JosephStyons

+0

Oui, la table2 est conservée. Je n'ai pas dit le contraire. Mais vous ne pouvez toujours pas me dire s'il s'agit d'une jointure GAUCHE ou d'une jointure DROITE, n'est-ce pas? –

+0

Dans l'ancienne syntaxe, on utilise généralement la condition de jointure pour déterminer quelle table est considérée comme LEFT et quelle est RIGHT. La commande dans la clause FROM n'est pas pertinente. – Turismo

0
SELECT * 
FROM table1, table2 
WHERE table1.yr =* table2.yr -1 

signifie la même chose que ceci:

SELECT * 
    FROM 
    table2 
    LEFT OUTER JOIN 
    table1 
    ON table1.yr = (table2.yr - 1) 

The * syntax is considered outdated, et n'est pas conforme aux normes ANSI.

Oracle has a similar construct comme ceci:

WHERE table1.yr (+)= table2.yr 
+1

En fait, la syntaxe Oracle est l'inverse. Le (+) est sur le côté de la table interne (ou facultative), mais l'étoile est sur le côté de la table externe. Donc table1.yr = * table2.yr serait table1.yr (+) = table2.yr – Turismo

+0

oui, vous avez absolument raison. Merci! – JosephStyons

0

Pour être clair et simple. Il s'agit d'un opérateur de jointure externe SQL-92 (more info)

Ne l'utilisez pas, son ancienne école, mais similaire à LEFT JOIN et RIGHT JOIN. Tout ce qu'il fait est de dire quel côté de la jointure est le côté "Parent", donc les lignes de ce côté seront considérées en premier.

Si vous essayez d'exécuter ceci sur SQL 2005, il va lancer une erreur, disant que vous devez l'exécuter en mode de compatibilité.