【问题标题】:VBA-ACCESS DAO SQL with UNION clause and WHERE clause带有 UNION 子句和 WHERE 子句的 VBA-ACCESS DAO SQL
【发布时间】:2019-09-04 21:34:30
【问题描述】:

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

“WHERE ([SummaryTbl].[WORK_ITEM_NMB]>2500) AND ([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)

谢谢!

【问题讨论】:

  • 你的 UNION 子句在哪里?
  • 您的 where 子句在新行上是否只是一个巧合。这是 VBA 的正确字符串连接语法吗?
  • 如果你像@LeeMac 那样格式化你的sql,你可以使用sqlinform.com/online-sql-formatter。这有助于调试。

标签: sql vba ms-access dao


【解决方案1】:

您需要将where 子句包含在两个 select 语句中,因为select 语句将在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 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 语句应该从 ParentChildTbl 表(在连接右侧)而不是 SummaryTbl 表中获取 WORK_ITEM_NMB 字段。

此外,由于您要加入 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

【讨论】:

  • Awww,你打败了我。我距离发布答案只有 5 秒。大声笑
  • 完美。非常感谢!
猜你喜欢
  • 2011-07-23
  • 1970-01-01
  • 2012-04-18
  • 1970-01-01
  • 2015-09-28
  • 1970-01-01
  • 1970-01-01
  • 2023-01-27
  • 2017-09-09
相关资源
最近更新 更多