我编写了一个查询,根据在主表中找到的条件过滤表,然后删除与第三个表匹配的行。我在Access中执行查询,所以我不能使用MINUS。它有效,但我发现它为所选记录的某些但不是全部返回重复的行。我用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 var上所有三个表之间的关系是1对1。结合使用LEFT JOIN,我希望每个ID有一行。
答案 0 :(得分: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'
答案 1 :(得分:0)
内部查询加入List_to_Check和master,但外部查询将List_to_Exclude加入Subscriber(也许你可以更改我称之为3个表的名称)
为避免重复,您需要在内部和外部查询中使用其中一个表。这样可以避免重复。