2012-07-25 68 views
1

中的不同状态列结合使用VBA在Access中生成SQL查询。我有退换货品的两个列表与状态栏,显示必需或可选两个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或可能可以使用的第一,但不幸的是我无法工作了语法。

回答

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) 
+0

他没有说他有身份证。 – 2012-07-25 16:33:25

+0

我有ID。这看起来不错 - 我现在会测试它。谢谢! – rryanp 2012-07-25 16:34:24

+0

这很好,但不幸的是,我的数据,查询运行速度很慢,导致前端刷新延迟(20秒左右)。我最终使用VBA将所有ID转储到临时表并运行查询,但这确实奏效。谢谢! – rryanp 2012-07-30 13:19:18

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'。

+0

当你像这样对一个字符串运行MAX,是否按字母顺序排列?我会测试这个。谢谢! – rryanp 2012-07-25 16:36:02

+0

@rryanp它在我用于今天的任何数据库中都这样做,但我还没有使用Access。 – 2012-07-25 16:43:57

+0

我测试了这个,并得到一个错误 - 我没有太多的疑难解答,但我认为Access可能有麻烦使用字符串值的最大值,因为我试着对整数字段,它工作正常。我实际上在我的数据库的另一个地方使用它,所以谢谢! – rryanp 2012-07-30 13:21:34

0

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

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

这种方式在tblMain首先被检索一次。

0

你可以做到这一点没有工会:

SELECT *, 
     (case when where_1 then 'Required' 
      when where_2 then 'Optional' 
     end) as status 
FROM tblMain 
WHERE (where_1) or (where_2) 

唉,然而,你没有case语句在ACCESS,让您使用IIF()代替:

SELECT *, 
     iif(where_1, 'Required', 'Optional') as status 
FROM tblMain 
WHERE (where_1) or (where_2) 
+0

SQL是一个通用的标签,所需的特殊风味是MS Access,所以没有大小写,恐怕。 – Fionnuala 2012-07-25 18:31:55