2017-07-04 2 views
1

Ich habe eine Tabelle (T1) mit 3 Spalten: id, Kategorie, SektorOracle, wie Teilmenge in einer Abfrage vergleichen

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

ich eine Abfrage mag, dass der IDs mit einer Untergruppe von Sektor und Kategorie Rückkehr von die startig id, das heißt:

select * from T1 where id=10 

Rückkehr 2 Datensätze

die Abfrage i mit dem gleichen 2 Datensätze andere IDs zurückgeben sogar zu schreiben bin versucht soll, wenn sie andere Datensätze. In diesem Beispiel sollte diese Abfrage nur die ID 20 zurückgeben, da es sich um eine Supermenge handelt.

Vielen Dank

+1

Ist 'NULL' in jeder der Spalten möglich? Wenn ja, wie sollte es behandelt werden? Dann: Kann es Duplikate geben (zwei oder mehr Zeilen mit derselben 'ID', derselben 'Kategorie' und demselben 'Sektor')? – mathguy

Antwort

0

Scheint Sie wnat alle Zeilen mit Kategorie und ausgewählte sectore id mit 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

Das OP möchte IDs zurückgeben, nicht komplette Zeilen. Er möchte die IDs, für die die Menge der Paare (Kategorie, Sektor) eine Obermenge der Menge ähnlicher Paare für die Eingabe-ID ist. Ihre Lösung scheint mit dieser Anforderung nichts zu tun zu haben. – mathguy

0

Hier ist eine Methode:

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; 

Es zählt zuerst die Anzahl der Zeilen für jede ID. Dies ist wichtig, um sicherzustellen, dass Sie alle haben.

Dann führt die Abfrage einen Self-Join auf category und sector. Es aggregiert nach der ersten ID und zählt die übereinstimmenden Zeilen. Wenn alle übereinstimmen, dann behalten Sie die id.

+0

Es funktioniert! Perfekt, danke –