2017-10-13 11 views
8

Mam niektóre przykładowe dane, takie jak:Logic, by sprawdzić, czy dokładne identyfikatory są obecne w grupie SQL Server

INSERT INTO mytable ([ID], [FK_ID], [TYPE_ID]) 
VALUES 
    (1, 10, 1), 
    (2, 11, 1), (3, 11, 2),  
    (4, 12, 1), (5, 12, 2), (6, 12, 3), 
    (7, 14, 2), (8, 14, 3) 

Teraz, tutaj staram się sprawdzić, czy w każdej grupie przez FK_ID mamy dokładne dopasowanie TYPE_ID wartości 1 & 2.

Więc oczekiwany wynik jest jak:

  1. (1, 10, 1) to powinno zawieść
    • jak w grupie FK_ID = 10 mamy tylko jeden rekord
  2. (2, 11, 1), (3, 11, 2) ten powinien przejść
    • Podobnie jak w grupie FK_ID = 11 mamy dwa zapisy.
    • I zarówno TYPE_ID są dopasowane wartości 1 & 2.
  3. (4, 12, 1), (5, 12, 2), (6, 12, 3) powinno to również nie
    • Jak mamy 3 zapisy tutaj.
  4. (7, 14, 2), (8, 14, 3) powinno to również nie
    • Nawet jeśli mamy dokładnie dwa rekordy, powinien zawieść jak TYPE_ID tutaj nie są dopasowane z 1 & 2 wartości.

Oto moja próba:

select * 
from mytable t1 
where exists (select count(t2.TYPE_ID) 
       from mytable t2 
       where t2.FK_ID = t1.FK_ID 
       and t2.TYPE_ID in (1, 2) 
       group by t2.FK_ID 
       having count(t2.TYPE_ID) = 2); 

To nie działa zgodnie z oczekiwaniami, ponieważ on również przekazać za FK_ID = 12 który ma trzy rekordy.

Demo: SQL Fiddle

Odpowiedz

2

Prawdopodobnie istnieje kilka różnych sposobów, aby to zrobić. Można być:

SELECT FK_ID 
FROM mytable 
GROUP BY FK_ID 
HAVING COUNT(*) = 2 
AND MIN(TYPE_ID) = 1 
AND MAX(TYPE_ID) = 2 
+1

Dzięki za rozwiązanie. Zadziałało. – CodeNewbie

+0

@CodeNewbie Najlepszym sposobem, aby podziękować komuś w Stackoverflow jest zaakceptowanie go jako odpowiedzi – Valli

+0

Jak możemy to zrobić? Nie wiem, jak to zrobić. – CodeNewbie

1

Możemy dodać min i max do grupy przez zapytania

select t1.* from mytable t1, 
(select fk_id, count(*) As cnt from mytable 

       Group by fk_id 
       Having count(*) = 2 
       AND max(type_id)=2 
       ANd min(Type_id) = 1) As t2 
Where t1.fk_id = t2.fk_id 
+1

Dzięki za rozwiązanie. Zadziałało! – CodeNewbie

0

inny sposób, ale mniej optymalny niż Nenad, znajduje użyć SELECT INTO (z wyjściem do tabeli tymczasowej) a następnie z inną kwerendą WYBIERZ tylko te wiersze, które mają właściwe wartości TYPE_ID.

Powiązane problemy