2017-07-04 74 views
1

我有一個表(T1)有3列:ID,類別,部門甲骨文如何在查詢中比較子集

id, category, sector 
1 1   2 
10 1   3 
10 5   4 
20 1   3 
20 5   4 
20 7   8 

我想,隨着部門和類別的子集返回的ID查詢在startig ID,那就是:

select * from T1 where id=10 

回報2條

查詢我想寫應該返回其他ID同爲2個記錄 即使他們有其他記錄。在這個例子中,這個查詢應該只返回ID 20,因爲它是一個超集。

非常感謝

+1

是否可以在任何列中使用NULL?如果是這樣,它應該如何處理?那麼:是否可以有重複(兩個或更多行具有相同的'id',相同的'category'和相同的'sector')? – mathguy

回答

0

看來你wnat所有類別和sectore選擇的行使用ID是10

select t1.id from t1 
inner join (
    select category, sector 
    from T1 where id=10 
) t on t.category = t1.category and t.sector = t1.sector 
+0

OP想要返回ID,而不是完整的行。他希望這些ID對(類別,扇區)是輸入ID的一組相似對的超集。您的解決方案似乎與該要求沒有任何關係。 – mathguy

0

這裏有一個方法:

select t.id 
from t join 
    (select t2.*, count(*) over (partition by id) as cnt 
     from t t2 
    ) t2 
    on t2.category = t.category and t2.sector = t.sector and 
     t2.id = 10 
group by t.id 
having count(*) = t2.cnt; 

它首先計算行數爲每個ID。這對確保你擁有所有這些非常重要。

然後,查詢在categorysector上進行自聯接。它通過第一個ID進行聚合並對匹配的行進行計數。如果全部匹配,則保留id

+0

它的工作原理!完美,謝謝 –