2016-04-21 9 views
0

Bei einer Querverweistabelle t Zusammenhang Tabelle a mit b:basierend auf Inklusion (Spaltenwert ist Superset)

| id | a_id | b_id | 
-------------------- 
| 1 | 1 | 1 | 
| 2 | 1 | 2 | 
| 3 | 1 | 3 | 
| 4 | 2 | 7 | 
| 5 | 2 | 3 | 
| 6 | 3 | 2 | 
| 7 | 3 | 3 | 

Was wäre die herkömmliche Art und Weise aller a_id deren b_id Auswählen eine Obermenge einer gegebenen Menge?

Zum Beispiel für den Satz (2,3), würde ich das Ergebnis erwarten:

| a_id | 
-------- 
| 1 | 
| 3 | 

Seit a_id 1 und 3 sind die einzige Gruppe von b_id, die eine Obermenge von (2,3) ist.

Die beste Lösung, die ich bisher gefunden habe (dank this answer):

select id 
from a 
where 2 = (select count(*) 
      from t 
      where t.a_id = a.id and t.b_id in (2,3) 
     ); 

Aber ich würde es vorziehen, die Berechnung Sachen wie Mächtigkeit zu vermeiden, bevor die Abfrage ausgeführt wird.

+0

Ich nehme an, Sie meinen Mächtigkeit der Menge '(2, 3)'. Welche Version von SQL verwenden Sie und wie leiten Sie die Werte weiter? –

+0

Korrekte Annahme. Ich benutze Postgresql 9. Die Werte werden aus einer textbasierten externen Datenbank abgerufen und in Tabelle "b" zur Normalisierung gespeichert. Also ist die Beispielmenge '(2,3)' einfach ein Ergebnis von 'select b_id von b, wobei value in ('some_string_value', 'another_string_value')'. –

Antwort

1

Sie können einfach die Abfrage anpassen als:

select id 
from a cross join 
    (select count(*) as cnt 
     from t 
     where . . . 
    ) x 
where x.cnt = (select count(*) 
       from t 
       where t.a_id = a.id and t.b_id in (2,3) 
      ); 
Verwandte Themen