2016-07-27 88 views
0

我已經寫了一個查詢來基於在主表中找到的條件篩選表,然後刪除與第三個表匹配的行。我在Access中執行查詢,所以我不能使用MINUS。它可以工作,但是我發現它爲一些但不是全部的選定記錄返回重複的行。我用DISTINCT修復了它,但我不知道它爲什麼會首先返回重複項。這是一個非常簡單的查詢:爲什麼這個SQL查詢需要DISTINCT?

select distinct sq.* 
from 
    (select List_to_Check.*, Master_List.SELECTION_VAR 
     from List_to_Check 
     left join Master_List 
     on List_to_Check.SUB_ID = Master_List.SUB_ID 
     where Master_List.SELECTION_VAR = 'criteria' 
    ) as sq 
left join List_to_Exclude 
on sq.SUB_ID = List_to_Exclude.SUB_ID 
where List_to_Exclude.SUB_ID is null 
; 

編輯:所有三個表之間的關係在SUB_ID變量上是1對1。結合使用LEFT JOIN,我預計每個ID有一行。

+0

很難說沒有你的表,數據和表之間的關係(從1到1,1到N等)的描述。 – sstan

+0

如果沒有樣本表數據的話,很難說清楚。一般來說,不需要區分,並通過適當的「group by」語句解決。 – topshot

+0

@sstan所有三個表之間的關係在SUB_ID var上都是1對1。這就是爲什麼我不希望重複。 – Rominus

回答

1

我建議拆開你的查詢,檢查重複。我的猜測是這是你的數據/ sub_ID不是很獨特。

從你的子查詢開始,因爲你要返回所有這些列。如果您在那裏得到重複項,則無論排除表中的內容如何,​​您的查詢都會返回重複項。

一旦清除了這些重複項,請檢查排除表以找到重複的sub_Id。

爲了節省故障排除的時間,如果知道重複的罪魁禍首,您可能需要限制返回的值,以便您可以專注於這些數據的特性。

我不知道這是個問題,但考慮邏輯上

on List_to_Check.SUB_ID = 
    Master_List.SUB_ID 
where Master_List.SELECTION_VAR = 'criteria' 

凡在左外右側的數據加入的條款可能不會返回所需的數據。試試這個,看看會發生什麼:

on List_to_Check.SUB_ID = Master_List.SUB_ID 
and Master_List.SELECTION_VAR = 'criteria' 
+0

嗯,就是這樣。我指的是Master_List .... false code alarm的非重複刪除版本.... – Rominus

0

內查詢連接List_to_Check和掌握,但外部查詢聯接List_to_Exclude與用戶(也許你可以更改名字,我叫這3個表)

爲了避免重複,你需要使用表的一個在兩個查詢內部和外部。這將避免重複。

+0

只有三個表,'sq'應該是內部查詢的結果,而不是實際的表。 – Rominus

+0

當然,其中一個表名應該出現在兩個行中,否則它會重複行嗎? – amitmah