Sous-requête dans une sous-requête

J'ai le tableau ci-dessous:

+-------------+------------+----------+-----------+-----------+ | Patient No | Event Date | Exam Key | Event Key | Exam Code | +-------------+------------+----------+-----------+-----------+ | 1 | 27/12/2015 | 4380 | 4792 | XHIPL | | 1 | 27/12/2015 | 4379 | 4792 | XPELV | | 2 | 11/02/2016 | 7006 | 2390 | XPELV | | 3 | 17/11/2015 | 5785 | 3948 | XHIPR | | 3 | 17/11/2015 | 5784 | 3948 | XPELV | | 4 | 13/03/2016 | 2633 | 7792 | XPELV | | 4 | 13/03/2016 | 2634 | 7792 | XHIPR | | 5 | 06/05/2016 | 6188 | 9169 | XHIPL | | 5 | 06/05/2016 | 6187 | 9169 | XPELV | | 6 | 05/09/2016 | 3396 | 3809 | XHIPR | | 6 | 05/09/2016 | 3397 | 3809 | XPELV | | 7 | 22/02/2016 | 8337 | 3706 | XPELV | | 7 | 22/02/2016 | 8336 | 3706 | XHIPL | | 8 | 27/11/2015 | 9376 | 7063 | XPELV | +-------------+------------+----------+-----------+-----------+ 

Je voudrais afficher les patients qui avaient 'XPELV' et 'XHIPL' ou 'XPELV' et 'XHIPR'

Après quelques tests, cela semble être le moyen le plus efficace:

 select t.PatientNo, t.EventDate, t.ExamKey, t.EventKey, t.ExamCode from #Temp as [t] where t.ExamCode in ('XHIPL', 'XHIPR') and t.PatientNo in (select t2.PatientNo from #Temp as [t2] where t2.ExamCode = 'XPELV') 

J'ai essayé quelques CTE pour vous, et la réponse ci-dessus en utilisant EXISTS. Cette méthode est marginalement (et je veux vraiment dire marginalement!) Plus efficace quand on compare les plans.

Cela devrait vous donner les résultats dont vous avez besoin:

 SELECT T.* FROM TABLE T INNER JOIN TABLE TT ON T.[Patient No] = TT.[Patient No] WHERE TT.[Exam Code] = 'XPELV' AND EXISTS(SELECT 1 FROM TABLE T2 WHERE TT.[Patient No]=T2.[Patient No] AND (T2.[Exam Code] = 'XHIPL' OR T2.[Exam Code] = 'XHIPR') ) 

Cette requête renvoie la sortie souhaitée:

 SELECT * FROM Patient WHERE [Patient No] IN ( SELECT DISTINCT p.[Patient No] FROM Patient p JOIN ( SELECT * FROM Patient WHERE [Exam Code] = 'XPELV' ) pp ON p.[Patient No] = pp.[Patient No] WHERE p.[Exam Code] IN ( 'XHIPL', 'XHIPR' ) ) ; 

et le résultat:

entrez la description de l'image ici