Announcement

Collapse
No announcement yet.

SQL-Abfrage über zwei oder noch mehr Tabellen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • SQL-Abfrage über zwei oder noch mehr Tabellen

    Hallo,

    wie kann ich in einer Interbase 6 o. Firebird 1 DB über eine IBQuery per SQL zwei Tabellen auf das Vorkommen eines Kriteriums abfragen, wobei die Feldnamen der beiden Tabellen, die das Kriterium enthalten, unterschiedlich sind.

    Hintergrund:

    Ich habe eine Datenbank, in der zwei Tabellen enthalten sind, nennen wir sie A und B, welche in jeweils unterschiedlichen Feldnamen, nennen wir sie A.SN und B.PIDSN, übereinstimmende Inhalte haben können.
    In A und B können jeweils mehrere Datensätze enthalten sein, auf die diese Bedingung (Feldinhalt = Kriterium) zutrifft.

    Ich möchte nun wissen, welche Datensätze in A und B enthalten sind, die in A.SN und B.PIDSN den gleichen Inhalt haben, ohne das der Effekt zuschlägt, dass bei Auffinden des Kriteriums in einem Datensatz von B automatisch als Ergebnis dieser Datensatz aus B mit jedem von A ausgegeben wird (obwohl in A keine Übereinstimmung da ist).

    Bei diesem SQL-Skript geschieht das leider so:

    select A.INDEX, B.INDEX from A, B
    where A.SN = 'A56788-4004' or B.PIDSN = 'A56788-4004'

    Gruss,

    H. Hoffman

  • #2
    Hallo,

    werden mehrere Tabellen in einer SELECT-Abfrage ohne eine Verknüpfungsvorschrift für den Fremd- und Primärschlüssel (oder einen anderen geeigneten Candidate Key) in einer Abfrage verbunden, so wird bei der Ausführung des SQL-Befehls das <b>kartesische Produkt</b> gebildet. Dabei wird jede Zeile einer Tabelle mit allen Zeilen der anderen Tabelle kombiniert - insoweit entspricht das geschilderte Verhalten dem SQL-Standard.

    Der "Datenmüll" verschwindet erst dann, wenn zusätzlich zum WHERE-Kriterium für das Einschränken der Ergebnismenge auch noch über die JOIN-Anweisung die logische Verknüpfung zwischen den beteiligten Tabellen definiert wird:
    <pre>
    SELECT
    A.INDEX, B.INDEX
    FROM
    A JOIN B ON a.Verbindungsspalte = b.Verbindungsspalte
    WHERE
    A.SN = 'A56788-4004' or B.PIDSN = 'A56788-4004'
    </pre>
    Wenn die betroffenen Tabellen keine geeignete Verbindungspalte für die logische Verknüpfung haben, darf man keinen JOIN verwenden. Statt dessen kann zu einer IN-Einschränkung in Verbindung mit einem Sub-SELECT gegriffen werden

    Comment

    Working...
    X