使用两个条件查找查询中的差异

时间:2018-08-17 19:22:38

标签: sql ms-access ms-office

我正在尝试找到一种方法来比较使用组合条件发送的两个查询。在这种情况下,我们有Prefixes(两个字母代码,如DA)和Pack编号1234567。在查询中,我创建了一个将这两件事组合在一起的字段,因此看起来1234567DA会通过来自它们各自独立表的每个查询来完成从。这个想法是,如果在一个表中而不是另一个表中,它将显示为“ False”。我尝试使用Unmatched查询,但这似乎不起作用。我目前所拥有的如下:

SELECT
    [1LagoTest].Prefix, 
    [1BigPicPackPref].BigPicPP,
    IIf([BigPicPP]=[LagoPP],"True","False") AS Compare,
    [1LagoTest].RETAIL,
    [1LagoTest].MEDIA
  FROM 1LagoTest
  LEFT JOIN 1BigPicPackPref 
    ON [1LagoTest].[Prefix] = [1BigPicPackPref].[BigPicPP]
  WHERE (((IIf([BigPicPP]=[LagoPP],"True","False")) Like "False") 
    AND (([1LagoTest].MEDIA) Not Like "*2019 FL*"))
  ORDER BY [1LagoTest].RETAIL;

现在,它将显示LagoPP缺少的内容,但不会给我带来BigPicPP缺少的内容。在正确方向上的任何帮助将不胜感激。

谢谢!

3 个答案:

答案 0 :(得分:1)

在没有FULL OUTER JOIN的Access中这有点棘手,但是一般的想法是使用FULL OUTER JOIN复制UNION ALL,然后从中进行过滤。

类似这样的东西:

SELECT I.Prefix,
       I.BigPicPP,
       I.Compare,
       I.Retail,
       I.Media
FROM (SELECT L.Prefix, 
             B.BigPicPP,
             IIf([BigPicPP]=[LagoPP],"True","False") as Compare,
             L.Retail,
             L.Media
      FROM 1LagoTest L
      JOIN 1BigPicPackPref B ON L.Prefix = B.BigPicPP
      WHERE L.Media NOT LIKE "*2019 FL*"

      UNION ALL

      SELECT L.Prefix, 
             B.BigPicPP,
             "False", --Missing records from 1BigPicPackPref
             L.Retail,
             L.Media
      FROM 1LagoTest L
      LEFT JOIN 1BigPicPackPref B ON L.Prefix = B.BigPicPP
                                 AND L.Media NOT LIKE "*2019 FL*"
      WHERE B.Prefix IS NULL

      UNION ALL

      SELECT B.Prefix, 
             B.BigPicPP,
             "False", --Missing records from 1LagoTest
             L.Retail,
             L.Media
      FROM 1LagoTest L
      RIGHT JOIN 1BigPicPackPref B ON L.Prefix = B.BigPicPP 
                                  AND L.Media NOT LIKE "*2019 FL*"
      WHERE L.Prefix IS NULL
     ) AS I

您只需要在联合的第一部分中使用IFF,因为在后两个部分中,一侧将始终为NULL,因此我们知道比较将始终失败并且为False

您完全不需要WHERE的当前(((IIf([BigPicPP]=[LagoPP],"True","False")) Like "False")子句的这一部分。但是,如果您只想查看False条记录,只需在外部选择区的底部添加WHERE I.Compare = "False"

答案 1 :(得分:0)

“不匹配”查询(假设通过向导)无法工作的原因是,您正在尝试查看与两个表/查询都不匹配的两个单独的表/查询的值。这不是“无与伦比”的工作方式。仅有一个表/查询与另一个表/查询不匹配。

很可能可以通过多种方法来完成此操作,但这可能会使您到达想要的位置(或接近它的位置):

SELECT 
    a.Prefix, 
    b.BigPicPP,
    IIf([BigPicPP]=[LagoPP],"True","False") AS Compare,
    a.RETAIL,
    a.MEDIA
FROM [1LagoTest] a 
LEFT JOIN [1BigPicPackPref] b ON a.Prefix = b.BigPicPP
WHERE a.MEDIA Not Like "*2019 FL*"
AND b.BigPicPP IS NULL
ORDER BY a.RETAIL
UNION 
SELECT 
    a.Prefix, 
    b.BigPicPP,
    IIf([BigPicPP]=[LagoPP],"True","False") AS Compare,
    a.RETAIL,
    a.MEDIA
FROM [1LagoTest] a 
RIGHT JOIN [1BigPicPackPref] b ON a.Prefix = b.BigPicPP
WHERE a.MEDIA Not Like "*2019 FL*"
AND a.Prefix IS NULL
ORDER BY a.RETAIL

注意:根据数据结构,ORDER BY可能会引起一些问题。

答案 2 :(得分:0)

所以我最终得到解决的方法是构建两个单独的查询。一个正在查看Lago缺少的内容,另一个正在查看BigPic缺少的内容。这是我得到给我两套缺失数据的唯一方法。如果我能通过一个查询找到一种更好的方法,我会报告,因为我仍然会继续使用它。