2017-10-13 40 views
8

我有這樣一些樣本數據:邏輯,以檢查是否確切的ID是否存在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) 

現在,在這裏我想通過FK_ID檢查,如果每個組中我們有精確匹配TYPE_ID1 & 2

因此,預期輸出是這樣的:

  1. (1, 10, 1)這會失敗
    • 作爲組FK_ID = 10我們只有一個記錄
  2. (2, 11, 1), (3, 11, 2)這應該通過
    • 與組一樣我們有兩條記錄。
    • 而且兩個TYPE_ID都匹配1 & 2的值。
  3. (4, 12, 1), (5, 12, 2), (6, 12, 3)這也應該失敗
    • 因爲我們有3條記錄在這裏。
  4. (7, 14, 2), (8, 14, 3)這也應該失敗
    • 儘管我們有確切的兩個記錄,它應該作爲這裏的TYPE_ID不與1 & 2值匹配失敗。

這裏是我的嘗試:

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); 

這工作不正常,因爲它也通過了FK_ID = 12其中有三個記錄。

演示:SQL Fiddle

回答

2

可能有這樣的幾種不同的方式。一個可能是:

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

感謝您的解決方案。有效。 – CodeNewbie

+0

@CodeNewbie最好的方法來感謝Stackoverflow中的人是接受它作爲你的答案 – Valli

+0

我們該怎麼做?我不知道該怎麼做。 – CodeNewbie

1

我們可以通過查詢

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

感謝您的解決方案。有效! – CodeNewbie

0

另一種方式加入最小和最大的羣體,但次優比內納德的,就是用SELECT INTO(與輸出到臨時表)然後用另一個查詢SELECT只選擇具有適當的TYPE_ID值的這些行。