2016-07-27 89 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