mysql - Entscheidung, auf welche Tabelle zugegriffen wird

SQL:
        ON WHERE wun.lieferantnr = lieferant.liefernr ORDER BY plz;

2 Fehler entdecke ich gerade.
Nach ON kommt kein Wort WHERE. Die Bedinungen werden zwar gleich geschrieben, jedoch ohne das WHERE.
Die Source des zweiten Feldes ist natürlich das Subquery data

SQL:
        ON wun.lieferantnr = data.liefernr ORDER BY plz;

Sorry wegen meinem bösen Spruch vorher. Ich dachte anhnd des von dir zitierten Fehlers, dass du die Namen nicht ausgewechselt hast.
 
Zuletzt bearbeitet von einem Moderator:
SQL:
        ON WHERE wun.lieferantnr = lieferant.liefernr ORDER BY plz;

2 Fehler entdecke ich gerade.
Nach ON kommt kein Wort WHERE. Die Bedinungen werden zwar gleich geschrieben, jedoch ohne das WHERE.
Die Source des zweiten Feldes ist natürlich das Subquery data

SQL:
        ON wun.lieferantnr = data.liefernr ORDER BY plz;

Sorry wegen meinem bösen Spruch vorher. Ich dachte anhnd des von dir zitierten Fehlers, dass du die Namen nicht ausgewechselt hast.

Kein Problem, hätte ich auch dran denken können. Hilft aber auch nicht. Meckert immer noch das gleiche an: Unknown column 'DATA.liefernr'
 
Zuletzt bearbeitet von einem Moderator:
die leifernr hast du nicht im Subquery. Die musst du da noch aus den 2 Tabellen rausziehen
 
die leifernr hast du nicht im Subquery. Die musst du da noch aus den 2 Tabellen rausziehen

Das ist mir zwar schon irgendwie klar, aber wo? Wenn ich das richtig verstehe, können die beiden Felder doch nur in die SELECTs nach dem INNER JOIN, denn in der späteren WHERE Klausel hat die liefernr nichts zu suchen, da sie ja mit dem NOT IN Vergleich nichts zu tun hat. Aber egal , wo ich das / die felder auch platziere, er meldet ständig, daß die DATA.liefernr unbekannt ist.
 
SQL:
SELECT
    wun.wunschnr,
    wun.fahrgnr,
    wun.modell,
    DATA.plz,
    DATA.ort,
    DATA.firmenname
FROM
    wunschkfz AS wun
    INNER JOIN (SELECT plz, ort, firmenname
                FROM wunschkfz
                UNION SELECT plz, ort, firmenname
                FROM lieferant
    ) AS DATA
        ON wun.lieferantnr = DATA.liefernr ORDER BY plz;

1) das statement
SQL:
 WHERE (plz, ort, firmenname) NOT IN (SELECT plz, ort, firmenname FROM wunschkfz)
kannst Du Dir sparen, da UNION alle Duplikate in der Menge ( plz, ort, firmenname) rauswirt.

2) damit dein statement _überhaupt_ funktioniert, musst du im UNION-bereich deines Statements irgendwor die spalte ->liefernr <- mitselektiere, also irgendwas in der form
SQL:
SELECT plz, ort, firmenname,liefernr ...

3) Wenn irgendwelche Mengen subtrahiert werden müssen, kann man das besser über NOT EXISTS statt NOT IN machen, da der IN-Operator bei MySQL i.d.R. unterirdische Performance liefert.Wenn die Mengen gleiche Spalten haben kann man auch direkt mit MINUS arbeiten, das ist am schnellsten.

Grüße
gore
 
Zuletzt bearbeitet von einem Moderator:
Hi Gore,

auch hier kommt immer wieder das Gleiche raus:

Unknown column 'DATA.liefernr' in 'on clause'.

Auch wenn mir das ganze noch nicht völlig klar ist, glaube ich nicht, daß es ohne das WHERE Statement geht, da es ja darum geht, daß die drei Felder NICHT in der wunschkfz Tabelle enthalten bzw. eben leer sind.

SQL:
SELECT
    wun.wunschnr,
    wun.fahrgnr,
    wun.modell,
    DATA.plz,
    DATA.ort,
    DATA.firmenname
FROM
    wunschkfz AS wun
    INNER JOIN (SELECT plz, ort, firmenname, lieferantnr
                FROM wunschkfz
                UNION SELECT plz, ort, firmenname, liefernr
                FROM lieferant
    ) AS DATA
        ON wun.lieferantnr = DATA.liefernr ORDER BY plz;
 
Zuletzt bearbeitet von einem Moderator:
SQL:
SELECT
    wun.wunschnr,
    wun.fahrgnr,
    wun.modell,
    DATA.plz,
    DATA.ort,
    DATA.firmenname
FROM
    wunschkfz AS wun
    INNER JOIN (SELECT plz, ort, firmenname, lieferantnr
                FROM wunschkfz
                UNION SELECT plz, ort, firmenname, liefernr
                FROM lieferant
    ) AS DATA
        ON wun.lieferantnr = DATA.liefernr ORDER BY plz;


ja, weil lieferantnr der spaltenname aus dem UNION ist. normalerweise wird der spaltenname des ersten SELECTs genommen.

nimm also
SQL:
   ON wun.lieferantnr = DATA.lieferantnr ORDER BY plz;
und damit sollte es gehen.

Grüße
gore
 
Zuletzt bearbeitet von einem Moderator:
So, jetzt ist das ganze schon mal einen gewaltigen Schritt weiter. Es funktioniert nur, wenn die beiden Vergleichsfelder den gleichen Namen haben, also nach der Umbenennung von lieferantnr in liefernr.
Er gibt auch schon fast die richtigen Daten aus, aber nur fast. Sind in der Tabelle wunschkfz die Lieferantendaten eingetragen, bringt er korrekt nur diese eine Zeile. Ist dort aber nur die Lieferantennummer eingetragen, liefert er diese Einträge zwei Mal, einmal mit allen Daten und einmal mit leeren Lieferantendaten (siehe Anhang). Natürlich könnte ich damit leben, indem ich alle Datensätze ignoriere, die nicht vollständig gefüllt sind, aber gibt es nicht vielleicht doch noch eine Möglichkeit, die gleich rauszufiltern?
 

Anhänge

  • Bildschirmfoto 2010-03-19 um 15.15.44.png
    Bildschirmfoto 2010-03-19 um 15.15.44.png
    20,8 KB · Aufrufe: 13
SQL:
SELECT
    wun.wunschnr,
    wun.fahrgnr,
    wun.modell,
    DATA.plz,
    DATA.ort,
    DATA.firmenname
FROM
    wunschkfz AS wun
    INNER JOIN (SELECT plz, ort, firmenname, lieferantnr
                 FROM wunschkfz
                 WHERE plz IS NOT NULL 
                        AND ort IS NOT NULL
                        AND lieferantnr IS NOT NULL
                UNION SELECT plz, ort, firmenname, liefernr as lieferantnr 
                FROM lieferant
                 WHERE plz IS NOT NULL 
                        AND ort IS NOT NULL
                        AND liefernr IS NOT NULL    ) AS DATA
        ON wun.lieferantnr = DATA.lieferantnr ORDER BY plz;

oder auch möglich

SQL:
SELECT
    wun.wunschnr,
    wun.fahrgnr,
    wun.modell,
    DATA.plz,
    DATA.ort,
    DATA.firmenname
FROM
    wunschkfz AS wun
    INNER JOIN (SELECT plz, ort, firmenname, lieferantnr
                 FROM wunschkfz
                UNION SELECT plz, ort, firmenname, liefernr as lieferantnr 
                FROM lieferant X
                 WHERE NOT EXISTS (SELECT 1
                                                         FROM wunschkfz Y
                                                    WHERE X.liefernr = Y.lieferantnr)
)    ) AS DATA
        ON wun.lieferantnr = DATA.lieferantnr ORDER BY plz;
 
Zuletzt bearbeitet von einem Moderator:
Hi Core,

funktioniert leider auch nicht. Die erste Variante bringt genauso noch beide Ergebnisse, die zweite, wobei in Zeile 17 eine Klammer zuviel ist, bringt nur die leeren Ergebnisse.
 
Zurück