1

我正在使用 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

4 回答 4

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)
于 2012-07-25T16:31:35.770 回答
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”。

于 2012-07-25T16:31:26.013 回答
0

由于所有数据都来自单个表,最好的选择可能是将逻辑从第二个查询移动到status列本身:

SELECT *, iif(condition1,'Required','Optional') as status 
FROM tblMain

这样一来,每一行tblMain只检索一次。

于 2012-07-25T18:06:07.850 回答
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)
于 2012-07-25T18:07:43.577 回答