La différence entre la gauche rejoindre et *= dans Sybase ASE 15
J'ai besoin d'aide pour comprendre cette question, quelle est la différence entre les 2 requêtes ci-dessous, tout ce que je sais qu'ils ne renvoie pas le même résultat.
SELECT a.col1, b.c1
FROM A a
LEFT JOIN B b
ON a.col1 = b.c1
WHERE b.status = 'Y'
et
SELECT a.col1, b.c1
FROM A a, B b
WHERE a.col1 *= b.c1
AND b.status = 'Y'
Avez-vous une requête qui utilise
AFAIR les 2 requêtes sont exactement équivalentes: nouveau (1992 ?) la notation à l'encontre de l'ancien (avant 1992) la notation. Utilisation de la nouvelle notation UNIQUEMENT.
*=
dans la production? Si non, ne vous inquiétez pas à propos de cette ancienne syntaxe et continuer avec la norme ISO/ANSI-92 JOIN
syntaxe des jointures.AFAIR les 2 requêtes sont exactement équivalentes: nouveau (1992 ?) la notation à l'encontre de l'ancien (avant 1992) la notation. Utilisation de la nouvelle notation UNIQUEMENT.
OriginalL'auteur R Vive L OL | 2012-12-07
Vous devez vous connecter pour publier un commentaire.
La première requête:
est équivalent à une jointure interne, car la
b.status
colonne (à partir du côté droit de la jointure externe gauche) est utilisé dans leWHERE
partie:La 2ème requête est (probablement) d'exécution:
qui peuvent donner des résultats différents, comme c'est (logiquement) requête différente.
C'est une des raisons pour lesquelles vous ne devez jamais utiliser cette ancienne syntaxe. Il est ambigu parfois, par exemple quand il y a plus que l'une des conditions ou plus d'un des jointures externes.
OriginalL'auteur ypercubeᵀᴹ
Je sais Sybase et SQL Server sont étroitement liés. Le
*=
a été supprimé à partir de SQL Server, mais même d'aussi loin que SQL Server 2000, il ne fonctionnait pas correctement, parfois interpréter comme une jointure gauche, et parfois de jointure croisée. Depuis Sybase et SQL Server est venu à partir du même produit de base, je suppose que c'est aussi votre problème avec elle et pourquoi les résultats sont différents. Ne pas utiliser la jointure implicite pour une jointure externe car il ne sera pas fiable de donner la bonne réponse.Voici une citation directe à partir de la documentation en Ligne de SQL Server 2000 qui traite de cette question:
OriginalL'auteur HLGEM
Désolé d'être un peu en retard, mais j'ai trouvé la solution: Dans la vieille syntaxe
*=
, la conditionb.Status = 'Y'
sera dans la jointure gauche sur la clause, alors que pour le même résultat dans la première requête, j'ai juste déplacé leb.Status = 'Y'
pour le "sur" la clause.OriginalL'auteur R Vive L OL
Ces requêtes ont la même apparence. Vous dites qu'ils ne sont pas les mêmes résultats. Avez-vous un exemple?
Où l'ancien et le nouveau rejoindre les notations ne diffèrent, c'est si vous avez déplacé le où la jointure
C'est différent, et ne peut pas être si facilement représentées dans l'ancienne notation (au moins pas dans d'Oracle, de ne pas avoir l'expérience directe de Sybase)
Exemple (quoique Oracle utilise
(+)
au lieu de*=
)OriginalL'auteur Laurence