Kurt: Da versteh ich mysql nicht.

Hallo,

folgende Abfrage

select Nummer, ID, Test from robot r
left join robotsub rs
ON r.ID = rs.ID
where rs.subID = 123

wird mit

#1052 - Column 'ID' in field list is ambiguous

beantwortet.

Das könnte ich ja verstehen, wenn ich mysql in der Query nicht mitteilen würde, dass das Feld ID eben identisch ist. Also, wenn das Feld "Test" in beiden Tabellen vorkäme, verstünde ich die Antwort, aber die ID ist, egalk aus welcher der beiden Tabellen mysql sie nimmt, doch identisch.

Hab ich da was übersehen?

Gruß, Kurt

  1. Hi,

    Das könnte ich ja verstehen, wenn ich mysql in der Query nicht mitteilen würde, dass das Feld ID eben identisch ist.

    Genauer sagst du, dass dich nur die Datensätze interessieren, in denen die Werte übereinstimmen.

    Hab ich da was übersehen?

    Du *musst* schlicht und einfach bei jeder Spalte angeben, aus welcher Tabelle sie entnommen werden soll, wenn sie in mehr als einer vorkommt.

    Stell' dir vor, in deiner ON-Klausel käme mit OR ... noch ein weiteres JOIN-Kriterium hinzu - dann ist ggf. nichts mehr mit "identisch".

    MfG ChrisB

    --
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
    1. Yerf!

      Genauer sagst du, dass dich nur die Datensätze interessieren, in denen die Werte übereinstimmen.

      Noch genauer sagt er mit dem left join dass ihn auch Werte interessieren die kein Gegenstück in "rs" haben. Es kann aslo sein das r.ID einen Wert hat und rs.ID NULL ist.

      Gruß,

      Harlequin

      --
      RIP --- XHTML 2
      nur die Besten sterben jung
      1. Noch genauer sagt er mit dem left join dass ihn auch Werte interessieren die kein Gegenstück in "rs" haben. Es kann aslo sein das r.ID einen Wert hat und rs.ID NULL ist.

        Was er aber durch die WHERE-Klausel wieder relativiert, so das nur das Ergebnis eines INNER-JOIN heraus kommt.

        1. Yerf!

          Was er aber durch die WHERE-Klausel wieder relativiert, so das nur das Ergebnis eines INNER-JOIN heraus kommt.

          Stimmt. Aber sollte man jetzt vom DBMS erwarten dass es all diese Abhängigkeiten untersucht um zu wissen das die 2 IDs identisch sind?

          Es gibt tatsächlich einen Weg in diese Richtung, der aber nicht überall untertützt wird... LEFT JOIN table USING id (weiß jetzt nicht ob MySQL das kann, scheinbar aber schon)

          Gruß,

          Harlequin

          --
          RIP --- XHTML 2
          nur die Besten sterben jung
          1. Es ist einfach nun mal so die Regel. (Punkt) Kannst du entweder akzeptieren und dich dran halten oder dir was anderes suchen. ;-)

          2. Tach!

            Was er aber durch die WHERE-Klausel wieder relativiert, so das nur das Ergebnis eines INNER-JOIN heraus kommt.
            Stimmt. Aber sollte man jetzt vom DBMS erwarten dass es all diese Abhängigkeiten untersucht um zu wissen das die 2 IDs identisch sind?

            Nein, sollte man nicht. Das ist nur unnötiger Aufwand pro Query. Korrigiere sie lieber einmalig und gut ist. Es ist ja nun wirklich nicht der Akt, sich auf eine von beiden Spalten festzulegen. MySQL versucht schon an (zu) vielen Stellen, dem Anwender entgegenzukommen, zwar meist dokumentiert aber ungewöhlich gegenüber anderen DBMSen.

            Es gibt tatsächlich einen Weg in diese Richtung, der aber nicht überall untertützt wird... LEFT JOIN table USING id (weiß jetzt nicht ob MySQL das kann, scheinbar aber schon)

            Kann es. Dadurch kann relativ einfach und explizit sichergestellt werden, dass id in beiden Tabellen vorkommt und gleichen Inhalt hat. Beim Join mit ON a.id=b.id müsste erst getestet werden, dass genau eine solche Bedingung und nicht ausschließlich anderslautende zum Joinen verwendet wurden.

            dedlfix.

            1. Yerf!

              Nein, sollte man nicht.

              War auch eher rhetorisch die Frage ;-) Ich bin ebenfalls gegen nicht durchschaubare Automatismen.

              Gruß,

              Harlequin

              --
              RIP --- XHTML 2
              nur die Besten sterben jung
  2. Hallo Kurt,

    folgende Abfrage

    select Nummer, ID, Test from robot r
    left join robotsub rs
    ON r.ID = rs.ID
    where rs.subID = 123

    #1052 - Column 'ID' in field list is ambiguous
    Hab ich da was übersehen?

    a) qualifizierte Spaltenbezeichner verwenden ist in solchen Fällen Pflicht.
    b) wie Dibo bereits angeführt hast, kannst Du gleich einen INNER JOIN verwenden.
    c) wenn Du wirklich einen LEFT JOIN benötigst, dann musst Du die Einschränkung
       auf rs.subID (da weisst Du, wie qualifizierte Spaltenbezeichner aussehen),
       in die Joinbedingung mit aufnehmen, siehe Archiv.
       In diesem Fall kannst Du außerdem USING nicht benutzen, siehe Handbuch.

    Freundliche Grüße

    Vinzenz