首页 > 解决方案 > 带有 UNION 子句和 WHERE 子句的 VBA-ACCESS DAO SQL

问题描述

这是我代码的一小部分,但在这个特定部分中,我试图让以下语句执行:

“在哪里([SummaryTbl].[WORK_ITEM_NMB]>2500)和([ParentChildTbl].[WORK_ITEM_NMB]>2500)”

我已经使用了所有的 JOINS/UNION,因为 ACCESS 不支持 FULL OUTER JOIN 并且一切正常。但是,我希望它只返回两个表的 WORK_ITEM_NMB 大于 2500 的值,这不起作用。它一直给我所有的记录。我在想我要么将 WHERE 子句放在不正确的位置和/或我必须将它添加到每个 JOIN 语句中。我没有收到错误。我只是得到所有的记录。

Set db = OpenDatabase(DBLoc)
SQL = "SELECT [SummaryTbl].[WORK_ITEM_NMB], [SummaryTbl].[WORK_ITEM_STS], [SummaryTbl].[RELEASE_NMB], [SummaryTbl].[NOMADS_PRIORITY], [SummaryTbl].[TEST_ACTUAL_DT], [SummaryTbl].[TRAIN_ACTUAL_DT], [SummaryTbl].[TITLE], [SummaryTbl].[DESCRIPTION], [SummaryTbl].[DETAILED_RQ_COMMENTS], [SummaryTbl].[TRAIN_COMMENTS], [SummaryTbl].[TEST_COMMENTS], [ParentChildTbl].[HasAssocWI] FROM SummaryTbl LEFT JOIN ParentChildTbl ON [SummaryTbl].[WORK_ITEM_NMB] = [ParentChildTbl].[WORK_ITEM_NMB] UNION SELECT [SummaryTbl].[WORK_ITEM_NMB], [SummaryTbl].[WORK_ITEM_STS], [SummaryTbl].[RELEASE_NMB], [SummaryTbl].[NOMADS_PRIORITY], [SummaryTbl].[TEST_ACTUAL_DT], [SummaryTbl].[TRAIN_ACTUAL_DT], [SummaryTbl].[TITLE], [SummaryTbl].[DESCRIPTION], [SummaryTbl].[DETAILED_RQ_COMMENTS], [SummaryTbl].[TRAIN_COMMENTS], [SummaryTbl].[TEST_COMMENTS], [ParentChildTbl].[HasAssocWI] FROM SummaryTbl RIGHT JOIN ParentChildTbl ON [SummaryTbl].[WORK_ITEM_NMB] = [ParentChildTbl].[WORK_ITEM_NMB]" & _
"WHERE ([SummaryTbl].[WORK_ITEM_NMB]>2500) AND ([ParentChildTbl].[WORK_ITEM_NMB]>2500)"


'Execute Query and populate recordset
Set rs = db.OpenRecordset(SQL, dbOpenSnapshot)

谢谢!

标签: sqlvbams-accessdao

解决方案


您需要在两个where语句中都包含该子句,因为这些语句将在;之前进行评估。因此,您需要类似的东西: selectselectunion

SELECT 
    [SummaryTbl].[WORK_ITEM_NMB], 
    [SummaryTbl].[WORK_ITEM_STS], 
    [SummaryTbl].[RELEASE_NMB], 
    [SummaryTbl].[NOMADS_PRIORITY], 
    [SummaryTbl].[TEST_ACTUAL_DT], 
    [SummaryTbl].[TRAIN_ACTUAL_DT], 
    [SummaryTbl].[TITLE], 
    [SummaryTbl].[DESCRIPTION], 
    [SummaryTbl].[DETAILED_RQ_COMMENTS], 
    [SummaryTbl].[TRAIN_COMMENTS], 
    [SummaryTbl].[TEST_COMMENTS], 
    [ParentChildTbl].[HasAssocWI] 
FROM 
    SummaryTbl LEFT JOIN ParentChildTbl ON
    [SummaryTbl].[WORK_ITEM_NMB] = [ParentChildTbl].[WORK_ITEM_NMB] 
WHERE 
    ([SummaryTbl].[WORK_ITEM_NMB]>2500) AND 
    ([ParentChildTbl].[WORK_ITEM_NMB]>2500)
UNION 
SELECT
    [SummaryTbl].[WORK_ITEM_NMB], 
    [SummaryTbl].[WORK_ITEM_STS], 
    [SummaryTbl].[RELEASE_NMB],
    [SummaryTbl].[NOMADS_PRIORITY], 
    [SummaryTbl].[TEST_ACTUAL_DT], 
    [SummaryTbl].[TRAIN_ACTUAL_DT], 
    [SummaryTbl].[TITLE], 
    [SummaryTbl].[DESCRIPTION], 
    [SummaryTbl].[DETAILED_RQ_COMMENTS], 
    [SummaryTbl].[TRAIN_COMMENTS], 
    [SummaryTbl].[TEST_COMMENTS], 
    [ParentChildTbl].[HasAssocWI] 
FROM 
    SummaryTbl RIGHT JOIN ParentChildTbl ON 
    [SummaryTbl].[WORK_ITEM_NMB] = [ParentChildTbl].[WORK_ITEM_NMB]
WHERE 
    ([SummaryTbl].[WORK_ITEM_NMB]>2500) AND 
    ([ParentChildTbl].[WORK_ITEM_NMB]>2500)

不过,看起来您的第二条select语句应该WORK_ITEM_NMBParentChildTbl表中(在连接的右侧)而不是SummaryTbl表中获取字段。

此外,由于您要加入该WORK_ITEM_NMB字段,因此您只需在要返回所有记录的表中对其进行过滤。

您还可以将选择标准应用于 的结果union,例如:

SELECT t.* 
FROM
(
    SELECT 
        [SummaryTbl].[WORK_ITEM_NMB], 
        [SummaryTbl].[WORK_ITEM_STS], 
        [SummaryTbl].[RELEASE_NMB], 
        [SummaryTbl].[NOMADS_PRIORITY], 
        [SummaryTbl].[TEST_ACTUAL_DT], 
        [SummaryTbl].[TRAIN_ACTUAL_DT], 
        [SummaryTbl].[TITLE], 
        [SummaryTbl].[DESCRIPTION], 
        [SummaryTbl].[DETAILED_RQ_COMMENTS], 
        [SummaryTbl].[TRAIN_COMMENTS], 
        [SummaryTbl].[TEST_COMMENTS], 
        [ParentChildTbl].[HasAssocWI] 
    FROM 
        SummaryTbl LEFT JOIN ParentChildTbl ON
        [SummaryTbl].[WORK_ITEM_NMB] = [ParentChildTbl].[WORK_ITEM_NMB] 
    UNION 
    SELECT
        [ParentChildTbl].[WORK_ITEM_NMB], 
        [SummaryTbl].[WORK_ITEM_STS], 
        [SummaryTbl].[RELEASE_NMB],
        [SummaryTbl].[NOMADS_PRIORITY], 
        [SummaryTbl].[TEST_ACTUAL_DT], 
        [SummaryTbl].[TRAIN_ACTUAL_DT], 
        [SummaryTbl].[TITLE], 
        [SummaryTbl].[DESCRIPTION], 
        [SummaryTbl].[DETAILED_RQ_COMMENTS], 
        [SummaryTbl].[TRAIN_COMMENTS], 
        [SummaryTbl].[TEST_COMMENTS], 
        [ParentChildTbl].[HasAssocWI] 
    FROM 
        SummaryTbl RIGHT JOIN ParentChildTbl ON 
        [SummaryTbl].[WORK_ITEM_NMB] = [ParentChildTbl].[WORK_ITEM_NMB]
) t
WHERE t.[WORK_ITEM_NMB] > 2500

推荐阅读