Access-o-Mania

Access-Forum (Deutsch/German) => Tabelle/Abfrage => Thema gestartet von: shadock am Juli 07, 2011, 23:26:55

Titel: SQL Abfrage
Beitrag von: shadock am Juli 07, 2011, 23:26:55
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
Titel: Re: SQL Abfrage
Beitrag von: oma am Juli 08, 2011, 00:33:10
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
Titel: Re: SQL Abfrage
Beitrag von: ebs17 am Juli 08, 2011, 16:20:04
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
Titel: Re: SQL Abfrage
Beitrag von: oma am Juli 08, 2011, 16:28:29
Hallo,

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

Gruß Oma
Titel: Re: SQL Abfrage
Beitrag von: ebs17 am Juli 08, 2011, 16:40:37
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
Titel: Re: SQL Abfrage
Beitrag von: oma am Juli 08, 2011, 17:15:26
Hallo ebs,

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

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

Gruß Oma
Titel: Re: SQL Abfrage
Beitrag von: ebs17 am Juli 08, 2011, 19:36:43
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
Titel: Re: SQL Abfrage
Beitrag von: shadock am Juli 10, 2011, 00:30:00
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
Titel: Re: SQL Abfrage
Beitrag von: oma am Juli 10, 2011, 01:54:07
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
Titel: Re: SQL Abfrage
Beitrag von: database am Juli 10, 2011, 09:17:08
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  ;)
Titel: Re: SQL Abfrage
Beitrag von: oma am Juli 10, 2011, 10:09:15
Hallo Peter,

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

Gruß Oma
Titel: Re: SQL Abfrage
Beitrag von: database am Juli 10, 2011, 10:16:09
Hallo,

Zitat...aber schneller

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

Schönen Sonntag! ::)
Titel: Re: SQL Abfrage
Beitrag von: shadock am Juli 10, 2011, 22:58:39
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


Titel: Re: SQL Abfrage
Beitrag von: oma am Juli 11, 2011, 00:43:19
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