【问题标题】:How to make a Query in MS-Access that returns the intersection of three other queries?如何在 MS-Access 中创建一个返回三个其他查询交集的查询?
【发布时间】:2019-04-29 21:36:46
【问题描述】:

我有一个“搜索”表单,允许用户输入位置、日期或 ID。此表单生成三个查询,如果没有为该类别输入搜索词,则返回适当的结果或所有记录。我打算进行第四个查询,该查询取前三个的交集,但无法使其工作。我已经查看了有关使用 SQL INNER JOIN 函数的类似问题,但无法使其工作。我的三个查询中的每一个的 SQL 如下所示。 (或者,如果有更好的方法,请告诉我。我尝试在一个查询中完成所有操作,结果一团糟)。

Qry_ByDate:

SELECT tbl_AssyMoves.[Assy ID], tbl_AssyMoves.[From ICA], tbl_AssyMoves.[From Loc], tbl_AssyMoves.[To ICA], tbl_AssyMoves.[To Loc], tbl_AssyMoves.Date, tbl_AssyMoves.Comments
FROM tbl_AssyMoves
WHERE (((tbl_AssyMoves.Date) Between [Forms]![Form1]![StartDate] And [Forms]![Form1]![EndDate]))

Qry_ByLoc:

SELECT tbl_AssyMoves.[Assy ID], tbl_AssyMoves.[From ICA], tbl_AssyMoves.[From Loc], tbl_AssyMoves.[To ICA], tbl_AssyMoves.[To Loc], tbl_AssyMoves.Date, tbl_AssyMoves.Comments
FROM tbl_AssyMoves
WHERE (((tbl_AssyMoves.[From ICA]) Like Forms!Form1!Combo_ICA) And ((tbl_AssyMoves.[From Loc]) Like Forms!Form1!Txt_Loc)) Or (((tbl_AssyMoves.[To ICA]) Like Forms!Form1!Combo_ICA) And ((tbl_AssyMoves.[To Loc]) Like Forms!Form1!Txt_Loc))

Qry_ByID:

SELECT tbl_AssyMoves.[Assy ID], tbl_AssyMoves.[From ICA], tbl_AssyMoves.[From Loc], tbl_AssyMoves.[To ICA], tbl_AssyMoves.[To Loc], tbl_AssyMoves.Date, tbl_AssyMoves.Comments
FROM tbl_AssyMoves
WHERE (((tbl_AssyMoves.[Assy ID]) Like [Forms]![Form1]![txt_AssyID]))

【问题讨论】:

  • 没有通配符,LIKE 是多余的,甚至可能会影响性能。请改用=

标签: sql database ms-access


【解决方案1】:

3 个查询的交集返回应用了 WHERE 子句中所有条件的所有行:

SELECT tbl_AssyMoves.[Assy ID], tbl_AssyMoves.[From ICA], tbl_AssyMoves.[From Loc],
tbl_AssyMoves.[To ICA], tbl_AssyMoves.[To Loc], tbl_AssyMoves.Date, tbl_AssyMoves.Comments
FROM tbl_AssyMoves 
WHERE
  (tbl_AssyMoves.Date Between [Forms]![Form1]![StartDate] And [Forms]![Form1]![EndDate])
  And
  (tbl_AssyMoves.[Assy ID]) Like [Forms]![Form1]![txt_AssyID])
  And
  (((tbl_AssyMoves.[From ICA]) Like Forms!Form1!Combo_ICA) And ((tbl_AssyMoves.[From Loc]) Like Forms!Form1!Txt_Loc)) Or (((tbl_AssyMoves.[To ICA]) Like Forms!Form1!Combo_ICA) And ((tbl_AssyMoves.[To Loc]) Like Forms!Form1!Txt_Loc))

【讨论】:

  • 如果用户将某些条件留空,我必须在其中添加“Or [item] Is Null”才能使查询正常工作,否则这正是我想要的。谢谢!
【解决方案2】:

您需要使用 UNION 语句来组合三个查询的结果。在 Access 中,UNION 自动不返回重复项,这可能是您想要的。如果您确实想要重复,可以使用UNION ALL

SELECT tbl_AssyMoves.[Assy ID], tbl_AssyMoves.[From ICA], tbl_AssyMoves.[From Loc], 
tbl_AssyMoves.[To ICA], tbl_AssyMoves.[To Loc], tbl_AssyMoves.Date, tbl_AssyMoves.Comments

FROM 

(SELECT tbl_AssyMoves.[Assy ID], tbl_AssyMoves.[From ICA], tbl_AssyMoves.[From Loc], 
tbl_AssyMoves.[To ICA], tbl_AssyMoves.[To Loc], tbl_AssyMoves.Date, tbl_AssyMoves.Comments 
FROM Qry_ByDate

UNION SELECT tbl_AssyMoves.[Assy ID], tbl_AssyMoves.[From ICA], tbl_AssyMoves.[From Loc], 
tbl_AssyMoves.[To ICA], tbl_AssyMoves.[To Loc], tbl_AssyMoves.Date, tbl_AssyMoves.Comments 
FROM Qry_ByLoc

UNION SELECT tbl_AssyMoves.[Assy ID], tbl_AssyMoves.[From ICA], tbl_AssyMoves.[From Loc], 
tbl_AssyMoves.[To ICA], tbl_AssyMoves.[To Loc], tbl_AssyMoves.Date, tbl_AssyMoves.Comments 
FROM Qry_ById)

【讨论】:

  • 在这种情况下,联合将不起作用,因为查询已设置为如果用户没有为该查询确定特定搜索条件,它们将返回所有内容。笨拙,但这是我当时唯一能确定的路径。上面的答案让我明白了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多