将两个SQL查询组合在一起,每个查询具有不同的状态列

时间:2012-07-25 16:28:13

标签: sql ms-access

我正在使用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,但不幸的是我在编写语法时遇到了麻烦。

4 个答案:

答案 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)