SELECT von Datensätzen, die in anderer Tabelle nicht enthalten sind

ash_ol

Grünschnabel
Guten Morgen ihr,

Ich bin neu hier und schon fast am verzweifeln bei der Arbeit.

Momentan bin ich dabei eine Bestandsdatenbank für unsere Tape Library in C# zu programmieren und hab schon die halbe Tischkante abgekaut weil diese blöde Datenbank nicht das ausspuckt was ich sehen will.

Aber zu meinem Problem:

Ich habe eine Access-Datenbank mit 2 Tabellen.
Eine davon ist eine "lokale" und die andere eine verknüpfte Tabelle welche direkt aus der Tape Library _liest_, da der Treiber nur ein improvisierter Treiber vom Hersteller ist und keinen schreibenden Zugang freigibt.

Nun brauch ich eine SQL-Anweisung die mir alle Datensätze aus der lokalen Tabelle ausgibt, welche _nicht_ in der verknüpften Tabelle sind.
Beispiel:

Tabelle 1 (lokal)
a
b
c
d
e

Tabelle 2 (verknüpft)
a
c
d
f

Ausgabe
b
e

Ich habs versucht mit 2 SELECTs die sich mit einem EXCEPT ausschließen, nem LEFT OUTER JOIN aber ständig krieg ich Fehlermeldungen:
Entweder
-System.Data.OleDB.OleDBException (0x80004005): IErrorInfo.GetDescription failed with E_FAIL(0x80004005) beim EXCEPT oder
-System.Data.OleDB.OleDBException (0x80040E21): Verknüpfung über Memo-, OLE- oder Hyperlinkobjekt (tabelle1.spalte1 = tabelle2.spalte1) nicht möglich.

Die SQL-Anweisungen sind vom Quellcode her auf jeden Fall korrekt, soviel ist sicher.
Ich hab eigentlich nicht vor die beiden Spalten erst in Arrays einzulesen und dann auszuwerten, das ist mir ehrlich gesagt zu umständlich für so eine "kleine" Abfrage.
Muss ich irgendwas bei der Einbindung der Datenbank in Access beachten oder habe ich noch andere Möglichkeiten die Tabelle in mein Projekt einzubinden?

Danke im Voraus

ash_ol
 
SQL:
SELECT T1.Field1, T2.Field1
FROM T1 LEFT JOIN T2 ON T1.Field1 = T2.Field1
WHERE T2.Field1 Is Null;
 
Zuletzt bearbeitet von einem Moderator:
SQL:
SELECT T1.Field1, T2.Field1
FROM T1 LEFT JOIN T2 ON T1.Field1 = T2.Field1
WHERE T2.Field1 Is Null;

Danke für die schnelle Antwort.
Leider funktioniert diese Anweisung nicht, bis auf die WHERE-Klausel hatte ich ja auch so eine Anweisung.

Fehler:
-System.Data.OleDB.OleDBException (0x80040E21): Verknüpfung über Memo-, OLE- oder Hyperlinkobjekt (tabelle1.spalte1 = tabelle2.spalte1) nicht möglich.
 
Zuletzt bearbeitet von einem Moderator:
Wenn gar nichts hilft, kannst du es auch mit der Brutalo-Methode versuchen:
SQL:
SELECT Field1
  FROM T1
 WHERE Field1 NOT IN 
( SELECT DISTINCT Field1 FROM T2 )
Das DISTINCT kannst du weglassen, wenn Field1 ein eindeutiger Schlüssel ist.
 
Zuletzt bearbeitet von einem Moderator:
Wenn gar nichts hilft, kannst du es auch mit der Brutalo-Methode versuchen:
SQL:
SELECT Field1
  FROM T1
 WHERE Field1 NOT IN 
( SELECT DISTINCT Field1 FROM T2 )
Das DISTINCT kannst du weglassen, wenn Field1 ein eindeutiger Schlüssel ist.

=(

Geht immer noch nicht. Aber zumindes hab ich einen anderen Fehlercode jetzt:

-System.Data.OleDB.OleDBException (0x80040E21): Ungültiges Memo- oder OLE-Objekt in Unterabfrage ('T1.Field1').

Nach der Mittagspause kommt nochmal so ein Dipl.-Dr.-Dr. der sich wohl den ganzen Tag mit SQL und so beschäftigt.
Vielleicht kann der mir helfen. Werds dann auch reinschreiben.

Trotzdem danke für die Antwort.
 
Zuletzt bearbeitet von einem Moderator:
O, du willst memo-Felder vergleichen. Dazu sind Memo-Felder aber nicht da!

du solltest sie in Strings wandeln wenn sie nicht grösser als 255 Zeichen sind.
 
Wenn deine Datenbank zu Verwechslungen neigt, dann gib die Tabellennamen einfach mit an.
SQL:
SELECT T1.Field1
  FROM T1
 WHERE T1.Field1 NOT IN 
( SELECT DISTINCT T2.Field1 FROM T2 )
 
Zuletzt bearbeitet von einem Moderator:
O, du willst memo-Felder vergleichen. Dazu sind Memo-Felder aber nicht da!

du solltest sie in Strings wandeln wenn sie nicht grösser als 255 Zeichen sind.

Verdammt das kann ich nicht. Wie gesagt der Treiber für die ODBC-Datenbank ist rein standardisierter ODBC-Treiber sondern solch einer der nur lesen kann.
Mit ändern is da nichts. Ich denke nicht das die Admins mich hier am Produktivsystem rumspielen lassen. =D

Wenn deine Datenbank zu Verwechslungen neigt, dann gib die Tabellennamen einfach mit an.
SQL:
SELECT T1.Field1
  FROM T1
 WHERE T1.Field1 NOT IN 
( SELECT DISTINCT T2.Field1 FROM T2 )

Das hab ich bereits getan, hilft aber auch nichts. =((

Ich wer jetzt einfach die Tabelle 2 in eine dritte Tabelle (TMP) kopieren und dann die Abgleiche fahren.
Kann ich denn die Einträge in den Memofeldern auf Datenbankebene einfach in ein Stringfeld kopieren?

EDIT: Habs jetzt hinbekommen! Einfach vor jeder Abfrage die verknüpfte Tabelle in eine TMP-Tabelle kopiert und von dort aus die Abgleiche fahren! Danke
 
Zuletzt bearbeitet von einem Moderator:
Zurück