2017-09-15 101 views
0

我正在使用MS Access 2010並苦苦尋找以下查詢。假設我有兩張表,tblWeeklyData和tblMainData,它們都包含有關學生及其班級的信息。每個表中的記錄通過公共密鑰fldStudentNumber進行鏈接。假設這兩個表還包含字段fldClass,其中包含學生正在使用的班級的名稱。MS Acces加入查詢與WHERE條件

tblWeeklyData保存新的學生信息,並與tblMainData進行比較,以僅識別正在學習新課程的現有學生。

我要查詢兩個表,以確定學生tblWeeklyData已經在tblMainData(上StudentNumber匹配),並且存在正在研究一個新的類,即有針對特定學生tblWeeklyData.fldClass和tblMainData.fldClass之間不匹配。 。

[編輯]內tblWeeklyData新來的學生沒有在tblMainData匹配StudentNumber不應由該查詢返回[/編輯]

我使用的SQL是:

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

如果tblWeeklyData包含行

fldStudentNumber fldClass 
A0001   Chemistry 

和tblMainData包含

fldStudentNumber fldClass 
A0001   Art 
A0001   Biology 

上述查詢正確地從tblWeeklyData現有的學生A0001返回研究新類化學:

fldStudentNumber fldClass 
A0001   Chemistry 

但是,此查詢不與下面的數據工作:

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

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

我想查詢僅從tblWeeklyData返回「A0001牙科」,因爲牙科是現有學生A0001正在學習的唯一的「新」類。然而,該查詢返回:

fldStudentNumber fldClass 
A0001   Chemistry 
A0001   Dentistry 

我不想排「A0001化學」被返回化學是不是學生A0001一個新的類,它已經在tblMainData存在。

[編輯]爲了證明不應該返回新同學,假設有

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

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

在這裏,學生A002不應該,因爲它不存在tblMainData返回兩個表。這可能嗎?

[/編輯]

我曾嘗試沒有成功上述查詢的許多變型。在最後一個例子中,我可以看到WHERE子句的計算結果爲「化學<>藝術」或「化學<>生物學」,因此我需要一個不同的WHERE條件來查看給定學生正在研究的每個「班級」如果一個類是新的,我已經看過SQL EXISTS IN和子查詢,但我還沒有能夠解決它。

在這個問題上的任何幫助將衷心感謝,

問候

羅比

回答

0

WHERE不起作用,因爲它只比較相同行的值,你需要比較第一個表的每個值都與第二個表的每個值相關,但不包括兩個表。

如果你這樣做是爲了每次只有一個學生,你可以使用IN

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

如果您需要做的幾個學生在同一時間或有一個以上的條件,那麼你需要用戶EXISTS代替:

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

謝謝阿爾貝託 - 您所提供的解決方案完美地工作,但是,我看到我的問題的初步框架過於簡化,並沒有指出應返回唯一存在兩個表中的學生。例如,如果在tblWeeklyData中存在一個新學生,該新學生在tblMainData中沒有匹配的StudentNumber,則不應返回。我會去我的第一篇文章,並編輯它來進一步解釋我的意思, – RobbieThompson73