我正在使用VBA在Access中生成SQL查询。我有两个SQL查询返回两个项目列表,其状态列显示必需或可选:
"SELECT *, 'Required' as status FROM tblMain WHERE " & where_1
"SELECT *, 'Optional' as status FROM tblMain WHERE " & where_2
* where_1 *和* where_2 *是我在VBA中构建的字符串变量 - 尽管它们并不重要。
我想要做的是有一个组合列表,如果一个项目显示在两个列表中,我希望该项目只显示一次“必需”状态(“必需”胜过“可选”) 。我从一个联合查询开始,但我不知道如何消除具有“可选”状态的重复行。
SELECT * FROM
((SELECT *, 'Required' as status FROM tblMain WHERE where_1)
UNION
(SELECT *, 'Optional' as status FROM tblMain WHERE where_2))
我在考虑使用DISTINCT或者可能使用FIRST,但不幸的是我在编写语法时遇到了麻烦。
答案 0 :(得分:2)
我建议您删除第二个语句中第一个语句中选择的ID。
SELECT *, 'Required' as status FROM tblMain WHERE where_1
UNION
SELECT *, 'Optional' as status FROM tblMain WHERE where_2
AND ID Not IN (SELECT ID FROM tblMain WHERE where_1)
答案 1 :(得分:1)
您可以使用MAX
。
SELECT *, MAX(status) FROM
((SELECT *, 'Required' as status FROM tblMain WHERE where_1)
UNION
(SELECT *, 'Optional' as status FROM tblMain WHERE where_2))
GROUP BY all_other_columns
请注意,您必须使用实际列替换“all_other_comuns”。
答案 2 :(得分:0)
由于所有数据都来自单个表,因此最佳选择可能是将逻辑从第二个查询移动到status
列本身:
SELECT *, iif(condition1,'Required','Optional') as status
FROM tblMain
这样,tblMain
中的每一行只能在一开始就检索一次。
答案 3 :(得分:0)
你可以在没有工会的情况下做到这一点:
SELECT *,
(case when where_1 then 'Required'
when where_2 then 'Optional'
end) as status
FROM tblMain
WHERE (where_1) or (where_2)
但是,你在ACCESS中没有case语句,所以你改用iif():
SELECT *,
iif(where_1, 'Required', 'Optional') as status
FROM tblMain
WHERE (where_1) or (where_2)