Marvin Esse: Union Select mit unterschiedlichen Where-Klauseln?

Hallo,

ich möchte gerne zwei Tabellen in eine Ergebnisliste packen. Tabelle 1 enthält die Felder vorname, nachname, pnr und kst. Tabelle 2 enthält die Felder vorname, nachame, kdnr, pnr, land.

Kann ich mit einer Abfrage aus Tabelle 1 nur die Einträge wo kst = '10001' ist und aus Tabelle 2 wo land = 'de' bekommen?

Ich hatte es mit Union select versucht, aber da erhalte ich die Fehlermeldung, dass das Feld land unbekannt ist.

select vorname, nachname from tabelle1 where kst = '10001' union select vorname, nachname from tabelle2 where land = 'de'

LG Marvin

  1. Tach!

    Kann ich mit einer Abfrage aus Tabelle 1 nur die Einträge wo kst = '10001' ist und aus Tabelle 2 wo land = 'de' bekommen?

    Warum nicht?

    Ich hatte es mit Union select versucht, aber da erhalte ich die Fehlermeldung, dass das Feld land unbekannt ist.

    Dann wird es wohl so sein und du hast irgendeinen Fehler gemacht. Hast du mal die Teil-Querys einzeln laufen lassen?

    dedlfix.

  2. Hallo,

    ich möchte gerne zwei Tabellen in eine Ergebnisliste packen. Tabelle 1 enthält die Felder vorname, nachname, pnr und kst. Tabelle 2 enthält die Felder vorname, nachame, kdnr, pnr, land.

    Normal ist das nicht ;)

    Kann ich mit einer Abfrage aus Tabelle 1 nur die Einträge wo kst = '10001' ist und aus Tabelle 2 wo land = 'de' bekommen?

    Freilich doch.

    Ich hatte es mit Union select versucht, aber da erhalte ich die Fehlermeldung, dass das Feld land unbekannt ist.

    select vorname, nachname from tabelle1 where kst = '10001' union select vorname, nachname from tabelle2 where land = 'de'
    

    Wenn Du mehrere Tabellen joinst, musst Du auch die Felnamen qualifizieren insbesondere dann, wenn in verschiedenen Tabellen gleiche Feldnamen stehen. Als Schlüssel für den join würde ich using(pnr) verwenden auf den ersten Blick.

    select 
    a.vorname    as firstname,
    a.nachname   as lastname,
    from
    table1 a
    join 
    table2 b using(pnr)
    where a.kst = '1001'
    and
    b.land = "de"
    

    Dein DB Design ist überarbeitungsbedürftig!

    mfg

    1. Tach!

      select vorname, nachname from tabelle1 where kst = '10001' union select vorname, nachname from tabelle2 where land = 'de'
      

      Wenn Du mehrere Tabellen joinst,

      Das macht er doch gar nicht und hat das nach meinem Verständnis auch gar nicht vor. Er will nur zwei Datenmengen aus zwei Quellen jeweils individuell einschränken und erst anschließend zusammenführen. Das ist ein Anwendungsfall für UNION. Ein Join ist dazu nicht notwendig und erzeugt nur unnötige Verknüpfungen.

      Dein DB Design ist überarbeitungsbedürftig!

      Ach, woraus schließt du denn das? Kennst du den Anwendungsfall?

      dedlfix.

      1. Recht hat er möglicherweise schon. Zwei Tabellen mit Name, Vorname, PNR könnten smelly sein. Wenn sie denn zum gleichen Bestand gehören...

        Der UNION sollte jedenfalls nicht an syntaktischen Problemen scheitern, er sieht richtig aus.

        Rolf