PDA

View Full Version : Select mit join erweitern um UNION



Peet
22-04-10, 11:22
Hallo zusammen,
ich habe heute einen sql-befehl, mit dem ich den kundenstamm, eine schlüsseldatei für texte und die auftragspositionen verknüpfe.

Beispiel
SELECT ..felder FROM kundenstamm a join schlüsseldatei b on sdkey2 =branche left join auftragspositionen c on c.firm=a.firm and c.kdnr=a.kdnr inner join artikelstamm d on c.firm = d.firm and c.artnr = d.artnr WHERE firm = '01' and a.branche = '01'...
order by kdnr, artnr for read only
(Feld,- und Dateinamen sind hier symbolisch)

Jetzt muss ich die branche (..and a.branche = '01') aber auch
noch in der datei der versandanschriften mit einbeziehen, weil
dort eine versandanschrift für einen kunden stehen kann, die anders ist als die versandanschrift im Kundenstamm !

Also doch mit UNION hatte ich gedacht :rolleyes:

Aber wie, ich kriege es einfach nicht hin, den ersten teil des sql-statements um den UNION zwischen Kundenstamm und Versandadressen zu ergänzen.

SELECT ..felder FROM kundenstamm UNION....

Ist jemand so fit im SQL, dass er das hinkriegt ? :confused:

Ich bin eher Autodidakt und hatte so einen Fall bisher nicht :o

Vielen Dank im Voraus ! :)

Peet

BenderD
22-04-10, 11:31
... wenn du es hinkriegst dein Problem nachvollziehbar darzustellen, sicher!

D*B



Ist jemand so fit im SQL, dass er das hinkriegt ? :confused:
Peet

Fuerchau
22-04-10, 11:33
Die bringst du ganz genauso mit "left join" dazu, wobei du allerdings keine einfache where-Bedingung auf diese Datei machen darfst. Dies führt automatisch zu einem Inner-Join, also:

select ... from FileA A
left join FileB B on a.key=b.key
where a.feld = ... and b.feld=...

ist identisch zu

select ... from FileA A
inner join FileB B on a.key=b.key
where a.feld = ... and b.feld=...

um trotzdem Left-Joins abzufragen ist ein Konstrukt erforderlich:

where ... (b.feld = ... or b.feld is null) ...

Ein Union ist da was ganz anderes:

select a, b, c from DateiA
union [all]
select a, b, c from DateiB

Die Anzahl der Felder beider Select's muss identisch sein, weigehend auch der Ergebnistyp.

BenderD
22-04-10, 11:43
... wenn wir schon bei der akademischen Diskussion über UNION gelandet sind:
UNION ist (fast) das einzige Konstrukt mit dem man Felder aus unterschiedlichen Quelltabellen im selben Feld der Zieltabelle darstellen kann.
Beispiel:
select name, ort, strasse
from kunde
union
select k.name, a.ort, a.strasse
from kunde k
join adress a
on ...

fast insofern, weil hier partiell ein subselect günstiger sein könnte.
Beispiel:
select k.name, (coalesce((select a.ort from adress a
where a.kdnr = a.kdnr), k.ort)
from kunde k

D*B

Die bringst du ganz genauso mit "left join" dazu, wobei du allerdings keine einfache where-Bedingung auf diese Datei machen darfst. Dies führt automatisch zu einem Inner-Join, also:

select ... from FileA A
left join FileB B on a.key=b.key
where a.feld = ... and b.feld=...

ist identisch zu

select ... from FileA A
inner join FileB B on a.key=b.key
where a.feld = ... and b.feld=...

um trotzdem Left-Joins abzufragen ist ein Konstrukt erforderlich:

where ... (b.feld = ... or b.feld is null) ...

Ein Union ist da was ganz anderes:

select a, b, c from DateiA
union [all]
select a, b, c from DateiB

Die Anzahl der Felder beider Select's muss identisch sein, weigehend auch der Ergebnistyp.

Peet
22-04-10, 11:44
Also ,erst einmal vielen Dank an Fuerchau !

Ich muss die kundenstammsätze und die versandadressen als einen "Topf" haben und nicht mit einander verknüpfen.
Und nicht jeder Kunde hat Sätze in den Versandadressen !

Ich muss aus allen Kundenstamm und Versandadressen die Kundennummern wissen, die die gewünschte Branche haben !

Ich bin daher davon überzeugt, dass ich einen UNIOn brauche.

BenderD, ich hatte Sie als "umgänglicher" kennengelernt !:eek:

Ich probiere mal weiter, bei "code400" habe ich gerade einen
interessanten Kontakt.

Nochmals vielen Dank !
Peet

Fuerchau
22-04-10, 11:49
Das ist ja dann noch einfacher:

select KDNR from Kunden K
where
exists (select * from FileA A where K.KDNR = A.KDNR and ...)
or
exists (select * from FileB B where K.KDNR = B.KDNR and ...)

... ist dann durch die Suchbedingung für die Branche zu ergänzen.

Peet
22-04-10, 11:53
Vorab schon mal WOW !

Ich probiere es heute noch aus !
Danke !
Peet