VBA-ACCESS DAO SQL 带有 UNION 子句和 WHERE 子句
VBA-ACCESS DAO SQL with UNION clause and WHERE clause
这是我代码的一小部分,但在这个特定部分,我试图让以下语句执行:
"WHERE ([SummaryTbl].[WORK_ITEM_NMB]>2500) AND ([ParentChildTbl].[WORK_ITEM_NMB]>2500)"
我已经使用了所有 JOINS/UNION,因为 ACCESS 不支持 FULL OUTER JOIN 并且一切正常。但是,我希望它仅 return 两个表的 WORK_ITEM_NMB 大于 2500 的值,这是行不通的。它一直给我所有的记录。我想我要么将 WHERE 子句放在不正确的位置 and/or 我必须将它添加到每个 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)
谢谢!
您需要在 select
语句中包含 where
子句,因为 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
table(在联接的右侧)中获取 WORK_ITEM_NMB
字段,而不是比 SummaryTbl
table.
此外,由于您是在 WORK_ITEM_NMB
字段上加入的,因此您只需要在要返回所有记录的 table 中对其进行过滤。
您还可以将选择标准应用于 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
这是我代码的一小部分,但在这个特定部分,我试图让以下语句执行:
"WHERE ([SummaryTbl].[WORK_ITEM_NMB]>2500) AND ([ParentChildTbl].[WORK_ITEM_NMB]>2500)"
我已经使用了所有 JOINS/UNION,因为 ACCESS 不支持 FULL OUTER JOIN 并且一切正常。但是,我希望它仅 return 两个表的 WORK_ITEM_NMB 大于 2500 的值,这是行不通的。它一直给我所有的记录。我想我要么将 WHERE 子句放在不正确的位置 and/or 我必须将它添加到每个 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)
谢谢!
您需要在 select
语句中包含 where
子句,因为 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
table(在联接的右侧)中获取 WORK_ITEM_NMB
字段,而不是比 SummaryTbl
table.
此外,由于您是在 WORK_ITEM_NMB
字段上加入的,因此您只需要在要返回所有记录的 table 中对其进行过滤。
您还可以将选择标准应用于 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