Anmelden

View Full Version : SQL order by Verständnisfrage



KingofKning
29-04-11, 09:44
Hallo *all,
ich habe hier 2 Dateien, einmal Adressen und einmal E-Mail. Verknüpft mit einem left join.

Ich wollte jetzt in der Übersicht alle Sätze mit E-Mail Adresse als erstes sehen, aber die Orderfunktion greift nicht.

SELECT T02.A4MAIL, T02.A4DFJN, T01.ADKTO, T01.ADNAM1, T01.ADNAM2,
T01.ADNAM3, T01.ADSTR, T01.ADLND, T01.ADPLZ, T01.ADORT, T01.ADKNAM,
T01.ADSA04, T01.ADSA05 FROM ADR01PF T01 left join
ADR04PF T02 on T02.A4KTO = T01.ADKTO WHERE adsts = 0 and
adfa = 1 and adsa05 = 32 ORDER BY a4mail

Warum?

GG

malzusrex
29-04-11, 11:04
weil eine LEERE Email-Adresse kleine wie eine gefüllte EMail-Adresse ist ...

KingofKning
29-04-11, 12:11
Du hast Recht, mir war erst jetzt aufgefallen das in den vermeintlichen Leeren Sätzen am Schluß ein Bindestrich stand, deswegen waren die E-Mails in der Mitte.
Also:
Am Anfang die Leeren, in der Mitte die richtigen und am Schluß die mit dem -.

Ich liebe gepflegte Stammdaten.....

GG

Pikachu
29-04-11, 12:16
Probier mal mit:

... ADR01PF T01 left join ADR04PF T02 on T02.A4KTO = T01.ADKTO and T02.A4MAIL<>'' WHERE ...

Fuerchau
29-04-11, 12:28
Dann kannst du den "Left join" auch gleich durch "Inner join" ersetzen, da eine solche Abfrage (egal ob in "Join .. on" oder "where ...") NULL-Werte nicht zulässt.

Ein Left Join will aber wohl auch Daten, die eben auf der rechten Seite nicht vorhanden, also NULL sind.

Pikachu
29-04-11, 12:41
Hab gerade alle 3 unter V5R4 ausprobiert und ein "left join ... on" bringt mir hier mit dieser zusätzlichen Bedingung dennoch mehr Datensätze als ein "inner join ... on" oder ein "join ... where".

KingofKning
29-04-11, 13:08
Hallo *all,
nur zum Verständniss: Ich wollte schon alle Kunden mit und ohne E-Mail Adresse, allein das es Datensätze mit - gab hatte ich nicht gesehen und mich deswegen über die Sortierung gewundert, ansonsten hätte ich direkt ein desc gemacht wenn der komplette Block am Ende gestanden hätte.

GG

Pikachu
29-04-11, 13:31
Die Datensätze mit - in der Anzeige (= NULL-Wert) sind die Kunden, die keinen Datensatz mit einer Emailadresse besitzen (keinen passenden Datensatz in Datei ADR04PF). Für genau die brauchst du ja den "left join".

B.Hauser
30-04-11, 13:04
Versuch mal folgendes:


SELECT T02.A4MAIL, T02.A4DFJN, T01.ADKTO, T01.ADNAM1, T01.ADNAM2,
T01.ADNAM3, T01.ADSTR, T01.ADLND, T01.ADPLZ, T01.ADORT, T01.ADKNAM,
T01.ADSA04, T01.ADSA05 FROM ADR01PF T01 left join
ADR04PF T02 on T02.A4KTO = T01.ADKTO WHERE adsts = 0 and
adfa = 1 and adsa05 = 32
ORDER BY NULLIF(a4mail, ' ');

Durch diese Order By Anweisung wird A4MAIL für die Sortierung in einen NULL-Wert konvertiert, sofern keine A4MAIL angegeben wurde.
NULL-Werte werden in der Sortierung immer am Ende aufgelistet.
Damit sollten die Sätze ohne eMail-Adresse am Ende stehen.

Birgitta

KingofKning
01-05-11, 08:57
Hallo Birgitta,
danke sieht gut aus

GG