Auswählen von datasätzen Auf der Basis einer Gruppe im SQL-server

Ich habe ein Szenario, in dem es zwei Tabellen gibt, man ist MAIN und zweitens ist Child . Es gibt 4 Statusarten 1 = Nicht gestartet 2 = Started 3 = Laufen 4 = Stopped

Ich habe randome Aufzeichnungen im Kind für jede Zeile der Haupttabellen, ich muss herausfinden, nur die datasätze zählen, in denen Kinder-Tabelle nur Status (1,4) verwendet.

unten füge ich das Drehbuch an.

  CREATE TABLE #Main ( ID INT , CreateDateTime DATETIME , LLevel INT ) CREATE TABLE #Child ( ID INT , MainID INT , STATUS INT ) -- Status(1= NotStarted, 2= Started ,3 = Ruunning ,4 = Stopped) INSERT INTO #Main SELECT 1 , '2015-12-24 18:48:41' , 1 UNION ALL SELECT 2 , '2015-12-24 18:49:59' , 3 UNION ALL SELECT 3 , '2015-12-24 18:51:01' , 1 UNION ALL SELECT 4 , '2015-12-24 18:53:11' , 4 UNION ALL SELECT 5 , '2015-12-24 18:57:11' , 2 INSERT INTO #Child SELECT 1 , 1 , 1 -- MIAN ID = 1 UNION ALL SELECT 2 , 1 , 2 UNION ALL SELECT 3 , 1 , 3 UNION ALL SELECT 4 , 2 , 1 -- MIAN ID = 2 UNION ALL SELECT 5 , 2 , 4 UNION ALL SELECT 6 , 3 , 1 -- MIAN ID = 3 UNION ALL SELECT 7 , 3 , 2 UNION ALL SELECT 8 , 3 , 3 UNION ALL SELECT 9 , 4 , 1 -- MIAN ID = 4 UNION ALL SELECT 10 , 4 , 2 UNION ALL SELECT 11 , 4 , 3 UNION ALL SELECT 12 , 5 , 1 -- MIAN ID = 2 UNION ALL SELECT 13 , 5 , 4 SELECT * FROM #Main SELECT * FROM #Child ORDER BY MainID ASC DROP TABLE #Main DROP TABLE #Child 

Ich bin ein image, diese Aufzeichnungen, die ich brauche, bedeutet, zählen sollte zwei sein. Bildbeschreibung hier eingeben

Dies ist vielleicht nicht der schnellste path, es zu tun, aber das Optimierer wird es nahe machen. Auch ist es klar zu sehen, dass ist richtig und verstehen, wie es funktioniert mit CTEs

 WITH haveone as ( SELECT DISTINCT MainID as ID FROM #Child WHERE STATUS = 1 ), havefour as ( SELECT DISTINCT MainID as ID FROM #Child WHERE STATUS = 4 ), haveboth as ( SELECT haveone.ID FROM haveone JOIN havefour ON haveone.ID = havefour.ID ), haveother as ( SELECT DISTINCT MainID as ID FROM #Child WHERE STATUS NOT IN (1,4) ) SELECT ID FROM haveboth WHERE ID NOT IN (SELECT ID FROM haveother) 

Ich habe herausgefunden und produziert Ergebnis auf diese Weise.

 SELECT count(m.id) FROM #main m INNER JOIN #child c on m.id = c.mainid and c.status in (1,4) and c.mainid not in (select mainid from #child where status in (2,3)) group by m.id having count(m.id) = 2