Auswählen von Zeilen aus der linken Tabelle, die mit Zeilen in der rechten Tabelle verknüpft sind

Tabelle I geben:

I1 I2 I3 I4 

Und der zweite Tisch C:

 C1 C2 C3 

Und der dritte CI:

 I1 C2 I1 C3 I2 C2 I3 C2 I3 C3 I4 C2 I4 C3 

Jede Idee der SQL-Anforderung, die nur die Zeile gibt, die der ersten Tabelle gemeinsam ist, wie das folgende Ergebnis:

 C2 

Für einen anderen Satz wie folgt:

 I1 C2 I1 C3 I2 C2 I3 C3 I4 C2 I4 C3 

das Ergebnis wäre leer. Und für

 I1 I2 I3 I4 I5 

und

 I1 C2 I1 C3 I2 C2 I3 C2 I3 C3 I4 C2 I4 C3 

reuslt: leer

* siehe die Diskussion

Vielen Dank.

Sie könnten NOT EXISTS

 SELECT * FROM TableC c WHERE NOT EXISTS ( SELECT 1 FROM TableI i WHERE NOT EXISTS ( SELECT 1 FROM TableCI ci WHERE ci.I = iI AND ci.C = cC ) ) 

Oder GROUP BY, HAVING, COUNT [DISTINCT] als jarlhs Vorschlag

 DECLARE @NumberI int = (SELECT count(*) FROM TableI) SELECT cC FROM TableC c INNER JOIN TableCI ci ON cC = ci.C INNER JOIN TableI i ON ci.I = iI GROUP BY cC HAVING COUNT(DISTINCT ci.I) = @NumberI 

Sie könnten verwenden: WHERE EXISTS (Unterabfrage)

Sie möchten also die zweite Spalte der Tabelle CI nur dann anzeigen, wenn der Wert in dieser Spalte allen datasätzen zugeordnet ist, die in Tabelle I vorhanden sind?

Wenn das der Fall ist, können Sie so:

 select Col2 from ( select Col2 , count(Col1) As Expr1 from CI group by Col2 ) A where Expr1 = (select count(*) from I) 

Hier ist eine einfache Lösung und die Grundvoraussetzung ist:
Wir wollen nur jene C-Aufzeichnungen, für die der Graf-Unterscheidungsmerkmal ihrer I-Aufzeichnungen gleich sein sollte, wie der Graf von I-Aufzeichnungen für den ganzen Tisch unterscheidet

  select TBL.C, count(distinct TBL.I) from TBL group by TBL.C having count(distinct TBL.I)= (select count(distinct TBL.I) from TBL) 

In Oracle, hier ist die Abfrage und die Ergebnismenge

  with TBL as ( select 'I1' I,'C2' C from dual union all select 'I1','C3' from dual union all select 'I2','C2' from dual union all select 'I3','C2' from dual union all select 'I3','C3' from dual union all select 'I4','C2' from dual union all select 'I4','C3' from dual ) select TBL.C, count(distinct TBL.I) from TBL group by TBL.C having count(distinct TBL.I)= (select count(distinct TBL.I) from TBL) 

Ergebnis Set:

  C2 4