2016-12-06 2 views
-1

Sagen wir, ich habe 3 Tabellen, a, b und c. A bezieht sich auf b, das sich auf c bezieht. Ich muss alle Datensätze von c, die sich auf alle Datensätze beziehen, aus a ziehen.Unterabfrage spezifische Datensätze ziehen

Wenn Tabelle A hat 2 Datensätzen hat und c 3 Datensätze und die folgenden Bedingungen erfüllt ist:

  • C1- bis A1 bezieht und a2
  • c2
  • c3 bezieht sich auf A1 und A2 bis A1 betrifft

Die Abfrage würde dann c1 und c3 zurückgeben.

Ich kann mich aus irgendeinem Grund nicht darum kümmern.

SELECT c.value 
FROM c 
INNER JOIN b 
    ON c.b_id = b.b_id 
INNER JOIN a 
    ON b.a_id = a.a_id 
WHERE c.value IN (???) 
+0

Willkommen bei SO. Bitte zeigen Sie [mcve] mit Beispieltabellendaten im Tabellenformat und der erwarteten Ausgabe an. Sie werden auf diese Weise bessere Ergebnisse erzielen. – OldProgrammer

+0

Ich würde gerne ein besseres Beispiel geben, aber wieder habe ich Probleme, meinen Kopf um das Problem zu bekommen. Ich werde es in Zukunft besser machen. Danke für den Ratschlag. – ToastGhost

+0

Wie verhält sich B zu A und C? Geben Sie uns Beispieldaten und erwartete Ergebnisse. – Fritz

Antwort

0

Ihre Frage und Beispielcode haben unterschiedliche Beziehungsrichtungen, was verwirrend ist. Akzeptieren Sie den Code als Indikator für die korrekte Beziehung Richtung und die Änderung durch einen der Zählung wird Ihnen eine möglich, aber nicht sehr elegante Lösung:

SELECT value FROM (
    SELECT c.value, COUNT(DISTINCT a.a_id) a_qty FROM c 
    INNER JOIN b ON c.b_id = b.b_id 
    INNER JOIN a ON b.a_id = a.a_id 
    GROUP BY c.value 
) WHERE a_qty = (SELECT COUNT(*) FROM a) 
0

Meine Erfahrung ist, dass die Oracle-Optimierer einen guten Job machen dies zu machen, effizient ausführen, insbesondere wenn die Match-Spalten indiziert sind:

SELECT * 
    FROM c 
WHERE EXISTS 
      (SELECT NULL 
       FROM a 
        INNER JOIN b 
         ON (a.abmatch = b.abmatch) 
         AND b.cbmatch = c.cbmatch);