2011-06-16 109 views
3

我無法找到給定查詢參數的獨佔組數據集。SQL:檢索唯一結構

我的表是這樣的:

 
GROUP_ID DOMAIN_ID (unique) 
-------- --------- 
111  2123 
111  2124 
111  2125 
111  2126 
112  2124 
112  2125 
113  2124 
113  2125 
113  2126 
114  2124 
114  2127 
114  2128 

好了,現在我需要找到一個GROUP_ID其中domain_id ONLY包含和即它不應該從例子返回111或113以上。

限制:不能使用SP /功能。它應該是一個SQL查詢。

非常感謝您的時間提前。

+0

聽起來就像是[您所需要的關係運算符是鴻溝(http://www.dbdebunk.com/page/頁面/ 772076.htm)又名「供應所有部件的供應商」。您是否想要除或不加餘數,即除供應商提供的零件外,供應商能否提供零件?如何處理空集,即如果供應的零件集合是空的,所有供應商能否提供或者是否更有用? – onedaywhen 2011-06-17 08:42:45

回答

1

感謝大家的回答我的問題。

最後,我成功地編寫一個查詢,給了我我想要的結果:

select GROUP_ID 
from MY_TABLE oq 
where DOMAIN_ID in (2124, 2125) 
group by GROUP_ID 
having count(GROUP_ID)=2 and 
count(GROUP_ID) = (select count(iq.DOMAIN_ID) 
from MY_TABLE iq WHERE iq.GROUP_ID=oq.GROUP_ID) 
1

如果按GROUPID您可以使用HAVING子句來尋找其分(DOMAINID)= 2124和max(DOMAINID)組= 2125

+0

我不能使用數字函數becase domain_id包含字母數字。我只想要只包含請求的domain_id集合的GROUP_ID。 – JSS 2011-06-16 17:24:26

1

下面是做到這一點的一種方法:

SELECT group_id FROM table WHERE group_id IN (SELECT group_id FROM table WHERE domain_id in (2124, 2124)) GROUP BY group_id HAVING count(group_id) = 2; 

這種方法的好處是,兩個domain_id不需要像其他答案中的一個那樣是順序的。

在sqlite3的使用你的數據,這將產生:

sqlite> create table t (a int, b int); 
sqlite> .import data t 
sqlite> SELECT a FROM t WHERE a IN (SELECT a FROM t WHERE b in (2124, 2124)) GROUP BY a HAVING count(a) = 2; 
a 
112 
+0

已經嘗試過,並沒有幫助。試試自己。 – JSS 2011-06-16 17:23:05

+0

我只是用sqlite試過,它運行良好。它是否爲您返回了太多記錄? – 2011-06-16 17:24:24

+0

Thx史蒂夫,但這不會因爲查詢本身是錯誤的。嘗試使用大數據集並驗證結果集。您會注意到,有許多組ID指定了參數值,但也有其他值。 – JSS 2011-06-17 08:16:17

-1
SELECT DISTINCT GROUP_ID FROM TABLE 
WHERE DOMAIN_ID IN (2124, 2125) 

像這樣的事情?

+1

正如我所說我只需要只包含這個數據集的GROUP_ID。 ypur解決方案給我111,112和113。如果是那麼簡單,我不會問。 :) – JSS 2011-06-16 17:22:25

+0

這將選擇具有2124,2125和2123的組。 – 2011-06-16 17:22:47

+1

我的歉意,我誤解了這個問題。我會留下這個答案來幫助澄清你真正的問題。 – 2011-06-16 17:38:18

1

你想要得到這樣的東西嗎?

SELECT DOMAIN_ID, COUNT(*) AS OCCURRENCES FROM TEST WHERE DOMAIN_ID = '2124' OR DOMAIN_ID =  '2125' GROUP BY DOMAIN_ID 

結果:

DOMAIN_ID OCCURRENCES  2124  4 
2125  3 
1

如果你沒有(GROUP_ID,域ID)複製可以使用

SELECT group_id, 
    SUM(CASE WHEN domain_id=2124 OR domain_id=2125 THEN 1 ELSE -1 END) AS matches 
FROM `mytable` 
GROUP BY group_id 
HAVING matches=2 
+0

Thx但這不會工作。 – JSS 2011-06-17 08:20:39

+0

在你的例子中工作正常,在一大組隨機數據上工作正常。在哪些數據上失敗了? – piotrm 2011-06-17 12:05:34

1
SELECT GROUP_ID 
FROM atable 
GROUP BY GROUP_ID 
HAVING COUNT(CASE WHEN DOMAIN_ID IN (2124, 2125) THEN 1 END) = 2 
    AND COUNT(*) = 2