2017-09-15 1 views
0

Ich benutze MS Access 2010 und kämpfen mit der folgenden Abfrage. Angenommen, ich habe zwei Tabellen, tblWeeklyData und tblMainData, die beide Informationen über Schüler und ihre Klassen enthalten. Die Datensätze in jeder Tabelle sind mit dem gemeinsamen Schlüssel fldStudentNumber verknüpft. Angenommen, beide Tabellen enthalten auch das Feld fldClass, das den Namen der Klasse enthält, die der Schüler belegt.MS Acces Join Abfrage mit WHERE-Bedingung

tblWeeklyData enthält neue Studenteninformationen und wird mit tblMainData verglichen, um nur vorhandene Studenten zu identifizieren, die neue Klassen studieren.

Ich möchte die zwei Tabellen abfragen, um Schüler in tblWeeklyData zu identifizieren, die bereits in tblMainData existieren (passend zu StudentNumber) und die eine neue Klasse studieren, dh es gibt keine Übereinstimmung zwischen tblWeeklyData.fldClass und tblMainData.fldClass für diesen bestimmten Schüler . .

[Bearbeiten] Neue Studenten innerhalb tblWeeklyData, die nicht von der Abfrage zurückgegeben werden [/ Edit]

Die SQL Ich verwende ist nicht eine passende StudentNumber in tblMainData haben sollte:

SELECT [tblWeeklyData].fldStudentNumber, [tblWeeklyData].fldClass 
FROM tblWeeklyData INNER JOIN tblMainData ON 
([tblWeeklyData].fldStudentNumber = tblMainData.fldStudentNumber) 
WHERE ((([tblWeeklyData].fldClass)<>[tblMainData].[fldClass])); 

wenn tblWeeklyData enthält Zeilen

fldStudentNumber fldClass 
A0001   Chemistry 

und tblMainData enthält

fldStudentNumber fldClass 
A0001   Art 
A0001   Biology 

Die obige Abfrage gibt richtig aus tblWeeklyData bestehenden Student A0001 die neue Klasse Chemie studieren:

fldStudentNumber fldClass 
A0001   Chemistry 

Allerdings ist diese Abfrage nicht mit den folgenden Daten arbeiten:

tblWeeklyData 
------------- 
fldStudentNumber fldClass 
A0001   Chemistry 
A0001   Dentistry 

blMainData 
---------- 
fldStudentNumber fldClass 
A0001   Art 
A0001   Biology 
A0001   Chemistry 

Ich möchte die Abfrage, nur "A0001 Dentistry" von tblWeeklyData als Zahnmedizin zurückzugeben, ist die einzige * neue "Klasse, die vorhandener Student A0001 studiert. Allerdings gibt die Abfrage:

fldStudentNumber fldClass 
A0001   Chemistry 
A0001   Dentistry 

ich nicht Zeile „A0001 Chemistry“ will zurückgegeben werden als Chemie für Schüler A0001 mit bereits bestehenden in tblMainData keine neue Klasse ist.

[Bearbeiten] Um zu zeigen, dass neue Studenten sollten nicht zurückgeschickt werden, nehme an, es gibt zwei Tabellen

tblWeeklyData 
------------- 
fldStudentNumber fldClass 
A0001   Chemistry 
A0001   Dentistry 
A0002   Zoology 

blMainData 
---------- 
fldStudentNumber fldClass 
A0001   Art 
A0001   Biology 
A0001   Chemistry 

Hier A002 Schüler sollte nicht zurückgegeben werden, da es nicht in tblMainData existiert. Ist das möglich?

[/ Edit]

Ich habe viele Variationen der obigen Abfrage ohne Erfolg versucht. Ich kann im letzten Beispiel sehen, dass die WHERE-Klausel mit "Chemistry <> Art" oder "Chemistry <> Biology" "True" ergibt, also brauche ich eine andere WHERE-Bedingung, die * jede "Klasse untersucht, die ein Student studiert Wenn eine Klasse neu ist, habe ich SQL EXISTS IN und Unterabfragen betrachtet, aber ich konnte sie noch nicht lösen.

Jede Hilfe in dieser Angelegenheit wäre dankbar erkennen,

Grüße

Robbie

Antwort

0

Die WHERE funktioniert nicht, weil es nur die Werte der Reihe gleichen vergleichen und Sie müssen vergleichen jeder Wert der ersten Tabelle mit jedem Wert der zweiten Tabelle, aber ohne beide Tabellen zu kombinieren.

Wenn Sie es für nur ein Schüler jedes Mal tun, können Sie IN verwenden:

SELECT fldStudentNumber, fldClass 
FROM tblWeeklyData 
WHERE fldStudentNumber='A0001' 
    AND fldClass NOT IN (SELECT fldClass FROM tblMainData WHERE fldStudentNumber='A0001') 

Wenn Sie es für mehrere Schüler gleichzeitig tun müssen, oder mehr als eine Bedingung haben, dann müssen Sie stattdessen Benutzer EXISTS:

SELECT fldStudentNumber, fldClass 
FROM tblWeeklyData 
WHERE NOT EXISTS (SELECT * FROM tblMainData 
    WHERE tblMainData.fldStudentNumber=tblWeeklyData.fldStudentNumber 
    AND tblMainData.fldClass=tblWeeklyData.fldClass) 
+0

Danke Alberto - Ihre bereitgestellte Lösung funktioniert perfekt, aber ich sehe, dass mein erster Framing der Frage zu vereinfachten war und nicht angegeben war, dass nur bestehenden Studenten in beiden Tabellen zurückgegeben werden sollen. Wenn beispielsweise in tblWeeklyData ein neuer Student vorhanden ist, der in tblMainData keine übereinstimmende StudentNumber aufweist, sollte er nicht zurückgegeben werden. Ich werde zu meinem ursprünglichen Beitrag gehen und es bearbeiten, um weiter zu erklären, was ich meine, – RobbieThompson73