Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

SQL Abfrage

Begonnen von shadock, Juli 07, 2011, 23:26:55

⏪ vorheriges - nächstes ⏩

shadock

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

oma

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
nichts ist fertig!

ebs17

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

oma

Hallo,

wobei "schön" zu definieren wäre ;D ;D ;D

Gruß Oma
nichts ist fertig!

ebs17

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

oma

Hallo ebs,

Frage war nur nach "schön" gemeint ;D

Den rationalen Begründungen ist beizupflichten, außer den letzten beiden??

Gruß Oma
nichts ist fertig!

ebs17

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

shadock

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

oma

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
nichts ist fertig!

database

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  ;)

oma

Hallo Peter,

habe das auch gerade bemerkt, du warst (wie immer) aber schneller ;)

Gruß Oma
nichts ist fertig!

database

Hallo,

Zitat...aber schneller

nicht so tragisch, konnte nur nicht schlafen, ist zu warm

Schönen Sonntag! ::)

shadock

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



oma

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
nichts ist fertig!