Hallo.
Ich habe zwei Tabellen in denen Namen vorkommen und brauche nun eine SQL-Abfrage auf Tabelle eins die mir alle
Namen dieser Tabelle ausgibt die nicht in Tabelle zwei vorkommen.
Tabelle 1:
aa
bb
cc
dd
Tabelle 2:
aa
bb
In Tabelle 1 und Tabelle 2 sind nun die Namen aa und bb gleich.
Ich will nun aus Tabelle 1 die Namen cc und dd ausgegeben bekommen.
Was für ein SQL-Statement brauche ich dafür?
shadock
Hallo shadock:
es sollte gehen:
select Tabelle1.Feld1, Tabelle2.Feld2
from Tabelle1 left join Tabelle2 on Tabelle1.Feld1 = Tabelle2.Feld2
Where Tabelle2.Feld2 Is Null
Gruß Oma
Zitatalle Namen dieser Tabelle ausgibt die nicht in Tabelle zwei vorkommen
Das nennt sich Inkonsistenzprüfung. Es gibt dazu auch einen Assistenten im Abfrageeditor. Ausprobieren!
Die schönere Lösung:
SELECT T1.*
FROM T1
WHERE NOT EXISTS
(SELECT Null
FROM T2
WHERE T1.Namensfeld = T2.Namensfeld)MfGA
ebs
Hallo,
wobei "schön" zu definieren wäre ;D ;D ;D
Gruß Oma
Zitat"schön" zu definieren
Ich nenne mal ein paar Punkte dazu:
- Sehr schnell.
- Indexnutzung möglich, hilft der Performance
- Hauptabfrage ist uneingeschränkt aktualisierbar.
- Bei deutlich aufwändigeren Schlüsseln zur Verknüpfung hat man im WHERE-Teil mehr Möglichkeiten als bei einem JOIN.
- Es macht nicht jeder so (Exklusivität).
- Es versteht nicht jeder ...
MfGA
ebs
Hallo ebs,
Frage war nur nach "schön" gemeint ;D
Den rationalen Begründungen ist beizupflichten, außer den letzten beiden??
Gruß Oma
Zitataußer den letzten beiden??
Gegenfragen:
Wie oft sieht man z.B. in diesem Forum (oder in anderen Foren) Anweisungen mit EXISTS?
Wie oft wird das "NOT IN (SELECT ...)", das eine Indexnutzung unterbindet, verwendet oder vorgeschlagen statt eines "NOT EXISTS"?
Alle wollen immer dass Beste, Günstigste, Variabelste. Warum nun gerade nicht hier im Abfragedesign?
Ich meine: Man könnte überprüfen, was einem als erstes als Lösung einfällt. Andere Lösungen wie die mit den JOIN´s inkl. EQUI JOIN sind mir auch vertraut und werden nach Fall eingesetzt.
Also ist das genannte "schön" eine grobe Verkürzung für positive Erfahrungen. Solch ein einfaches Wort ist manchem leichter zugänglich als eine ausführliche fachliche Begründung, die dann noch mit Beispielen und Messungen zu untersetzen wäre, aber wiederum unverständlich erscheint, wenn es dem Leser um das Funktionieren an sich mit 100 Datensätzen geht und nicht um Mengen und Bedingungen von richtigen Datenbanken.
Ein wenig geht es auch um Gewohnheitsbildung. Was der Neuling als erstes (einziges?) als funktionierende Lösung erfährt, wird er in der Folge immer wieder abschreiben.
MfGA
ebs
Hallo,
erst einmal vielen Dank für eure Hilfe aber ich habe mich leider nicht präzise genug ausgedrückt.
Hier noch einmal Tabelle 1:
Namen
aa
bb
cc
dd
und hier nun Tabelle 2
Namen Status
aa 0
bb 0
cc 1
dd 1
Es sollen alle Namen aus Tabelle 1 angezeigt werden die in Tabelle 2 den Status 1 haben. Es sollen also nur cc und dd ausgegeben werden.
Es muss also auf den Status ankommen.
Sorry.
shadock
Hallo,
entweder
SELECT Tabelle1.Feld1, Tabelle2.Feld2, Tabelle2.Status
FROM Tabelle1 INNER JOIN Tabelle2 ON Tabelle1.Feld1 = Tabelle2.Feld2
WHERE Tabelle2.Status=1
oder
SELECT Tabelle1.*
FROM Tabelle1
WHERE NOT EXISTS
(SELECT *
FROM Tabelle2
WHERE Tabelle1.Feld1 = Tabelle2.Feld2 AND Status=1)
wobei 2. Möglichkeit aktualisierbar ist
Gruß Oma
Hallo,
kleiner Einwand...
Zitat...alle Namen aus Tabelle 1 angezeigt werden die in Tabelle 2 den Status 1 haben
SELECT Tabelle1.*
FROM Tabelle1
WHERE EXISTS
(SELECT *
FROM Tabelle2
WHERE Tabelle1.Feld1 = Tabelle2.Feld2 AND Tabelle2.Status=1)
HTH
p.s. die Variante mit dem JOIN arbeitet jedoch richtig ;)
Hallo Peter,
habe das auch gerade bemerkt, du warst (wie immer) aber schneller ;)
Gruß Oma
Hallo,
Zitat...aber schneller
nicht so tragisch, konnte nur nicht schlafen, ist zu warm
Schönen Sonntag! ::)
Hallo oma und database,
danke für eure Hilfe. Funktioniert super aber noch eine Frage an oma.
Was meinst Du mit "wobei 2. Möglichkeit aktualisierbar ist"?
shadock
Hallo shadock,
eine Abfrage nennt man nicht aktualisierbar, wenn man im Ergebnis der Abfrage (in Datenblattansicht oder in Formular) die Daten nicht bearbeiten kann bzw. keine Datensätze hinzufügen kann. das sind:
Abfragen mit Gruppierungen u. SQL-Aggregatfunktionen
Unionabfragen
Abfragen mit 2 nicht verknüpften Tabellen(kartesisches Produkt)
Abfragen mit Eigenschaft Keine Duplikate =Ja
Abfragen mit mehreren Tabellen und bestimmten Verknüpfungen
letzterer Punkt gilt für die Abfrage mit INNER JOIN, probiere es; die daten sind nicht änderbar.
Dagegen kannst du die Daten der 2. Abfrage ändern!
Gruß Oma