MS-ACCESS如何创建查询以选择具有与其他查询匹配的字段的所有记录?

时间:2013-08-13 21:54:05

标签: mysql ms-access

我知道这个问题可能听起来令人困惑,但让我试着简化它。

我有一个查询,让我们调用query1,以及一个更大的所有产品表。这是query1:

Item_Code    Description    Order_Qty    Option
1000         Prod1          5            Blue
1005         Prod5          3            Brown
1602         Prod6          1            Red
5620         Prod8          6            Yellow
9865         Prod2          1            Brown
1624         Prod3          3            Brown
9876         Prod12         4            Blue

现在在我的表格中,我有一个更大的相同格式的产品列表。我想创建一个包含所有蓝色,棕色,红色和黄色的新查询。它有效,但总有重复。

我不确定如何发布我的尝试,但我会解释我的尝试。我创建了一个新查询并包含了table和query1。我在两者之间建立了关系,只包括“选项”相等的行。但由于某种原因,生成的查询将出现重复。如:

Item_Code    Description    Order_Qty    Option
1000         Prod1          5            Blue
1009  <--    Prod2          6            Blue    
1009  <--    Prod2          6            Blue    
1010  <--    Prod9          7            Blue    
1010  <--    Prod9          7            Blue    
1011  <--    Prod11         9            Blue    
1011  <--    Prod11         9            Blue    
9876  <--    Prod12         4            Blue    
9876  <--    Prod12         4            Blue
1005  <--    Prod5          3            Brown
1005  <--    Prod5          3            Brown
9865  <--    Prod2          1            Brown
9865  <--    Prod2          1            Brown
1624  <--    Prod3          3            Brown
1624  <--    Prod3          3            Brown
9877         Prod99         7            Brown
1111  <--    Prod67         8            Brown   
1111  <--    Prod67         8            Brown    
1602         Prod6          1            Red
1752         Prod56         2            Red
5620         Prod8          6            Yellow

最糟糕的是,它不会总是重复。也许我接近它错了。

我知道这可能是tldr的情况,但如果有人能提供帮助那就太棒了。

感谢。

3 个答案:

答案 0 :(得分:2)

您需要在查询中添加GROUP BY子句或DISTINCT关键字。

SELECT DISTINCT Item_Code, Description, Order_Qty, Option

(或点击Access中的任何选项都会做同样的事情。)

根据您提供的信息,无法诊断查询返回“重复”行的原因。

all_products中的行与query1中的两行或多行匹配时,查询返回“重复”行,因此您可以从all_products获取每行匹配的行副本来自query1的行。


如果您从query1获得了Option的明确列表,则可能会获得更好的性能。 (我并没有真正“做”MS Access。我提出了这个问题,因为它被标记为“mysql”.Jot数据库引擎很酷,但它在多用户环境中运行不正常。)在SQL中服务器,Oracle,MySQL,DB2,Teradata等。我们写这样的查询:

SELECT p.Item_Code
     , p.Description
     , p.Order_Qty
     , p.Option
  FROM mytable p
  JOIN ( SELECT q1.Option
           FROM query1 q1
          GROUP BY q1.Option
       ) q
    ON q.Option = p.Option

答案 1 :(得分:2)

您的查询返回重复项,因为您可能只从一个表中选择列,但您的连接不够具体,因此生成的笛卡尔积会使您的结果倍增。即因为您的唯一加入是option = option,这意味着每个blue会加入其他所有blue。您可能希望在连接中的ON子句中有更多限制。

使用distinct可能会使它看起来像是正确答案,但您只是掩盖了问题。

答案 2 :(得分:0)

如果我正确理解了您的问题,则希望将Query1用作一种查找表,以从表中选择行。

所以您可以这样做:

select * from table
where color in 
(select color from query1)

如果要基于2个字段制定选择标准,则可以执行以下操作:

select * from table
where color1&color2 in 
(select color1&color2 from query1)

如果要查找遗漏,可以执行以下操作:

select * from table
where color not in 
(select color from query1)

请注意,这仅从表中选择数据。它不执行表和查询1之间的任何联接。

我认为其他人都是正确的。由于每个表中的联接项都有多行,因此您获得了带有联接的奇怪重复项。