Intérieure de se joindre à une instruction select où l'intérieure instruction select where clause références de la sélection externe?
C'est un allégée de la requête de mon grand problème, mais l'essentiel, c'est que je suis en train de jointure interne à sélectionner l'endroit où la sélection est limitée par la sélection externe. Est-ce possible? J'obtiens une erreur à propos de plusieurs parties de l'identificateur de S. Élément et S. SerialNum sur la sélection interne.
L'essentiel est de cela, nous devons groupe par l'élément/de série, et la requête est assez grand, nous ne voulons pas revenir en arrière et de tout groupe dans l'ensemble de la requête pour ce mineur rejoindre.
SELECT S.Item, S.SerialNum, S.ReceiveDate
FROM SALES S
INNER JOIN (SELECT W.Item, W.SerialNum, MIN(W.SalesDate)
FROM WARRANTY W
WHERE W.Item = S.Item AND
W.SerialNum = S.SerialNum
GROUP BY Item, SerialNum, SalesDate) WW
ON S.Item = WW.Item AND WW.SerialNum
Je ne suis pas tout à fait sûr de ce que vous demandez ici.. mais à partir de l'allure de cette requête, retirez votre intérieur
Vous requête externe ne fait pas référence à toutes les variables dans la requête interne. Donc, il est tout simplement agir comme un filtre. Avez-vous l'intention d'inclure minSalesDate dans la requête externe?
Je n'ai l'intention d'inclure, oups. La main de la saisie de la requête.
WHERE W.Item...
clause et de l'inclure dans le ON
déclaration. Les jointures internes automatiquement faire ce qu'il semble que votre WHERE
clause est en train de faire..Vous requête externe ne fait pas référence à toutes les variables dans la requête interne. Donc, il est tout simplement agir comme un filtre. Avez-vous l'intention d'inclure minSalesDate dans la requête externe?
Je n'ai l'intention d'inclure, oups. La main de la saisie de la requête.
OriginalL'auteur Alex Kwitny | 2012-08-22
Vous devez vous connecter pour publier un commentaire.
Semble que vous avez votre
JOIN
de référence dans le mauvais endroit.Modifier, en fonction de votre commentaire à propos de filtrage, vous pouvez placer un
WHERE
clause sur l'intérieur de votreSELECT
:SalesDate
ne devrait pas être dans leGROUP BY
etMIN(W.SalesDate)
besoin d'un alias.corrigé, merci
Donc je ne peux pas mettre un
where
clause dans l'intérieur de laselect
déclaration? Le but étant, certains des résultats ont un statut "Expired", j'ai donc ajoutéMIN(EXPIRED)
et fait ungroup by
sur elle, puis rejointON EXPIRED = 0
. Je me demandais si il y a plus compliqués où je ne serai pas en mesure de le faire.oui, vous pouvez placer un
WHERE
clause relative à l'intérieureselect
. Mais vous ne pouvez pas faire référence à une table externe dans une sélection interne. Toutes les références de prendre place dans leON
déclarationAvez-vous essayé ?
SELECT S.Item, S.SerialNum, S.ReceiveDate FROM SALES S Where Exists ( SELECT W.Item, W.SerialNum, MIN(W.SalesDate) FROM WARRANTY W WHERE W.Item = S.Item AND W.SerialNum = S.SerialNum GROUP BY Item, SerialNum )
OriginalL'auteur Taryn
Vous pouvez essayer un common_table_expression au lieu de se JOINDRE à nous. De vérifier la clause ici.
Il pourrait être quelque chose comme ceci:
Noter une REMARQUE sur le Plan de l'Exécution de cette solution: Cette solution de plan doit être le même que bluefeet de la solution. (Donc dans le fond c'est le même processus à partir de l'optimiseur) Mais je pense que cette déclaration est plus lisible.
J'aime le plus lisible solution pour vous. Est-ce tout plus lent?
Non, comme je l'ai mentionné, c'est le même plan d'exécution derrière. (Je veux dire de la même manière que Bluefeet de la solution) de Sorte que la performance est la même.
OriginalL'auteur András Ottó