【问题标题】:Access SQL Query: Left Join does not display all Left Table rows, which is a Union QueryAccess SQL Query:Left Join不显示所有Left Table行,是Union Query
【发布时间】:2017-12-28 16:57:28
【问题描述】:

我有两个查询和一个要合并的表:

  • [产品需求](表格)
  • [北美供应](查询)
  • [欧盟供应](查询)

这三个具有相同的字段:

  • 日期
  • 地区
  • 产品
  • 数量

虽然,我会说在供应查询中,我强制 DateRegion 为静态值,而 ProductQuantity 是从表中提取的。例如:

SELECT 
  DateValue("12/1/2017") AS [Date], 
  "North America" AS [Region],  <-- Would be "Europe" for [EU Supply]
  [NA Inv Report].[Product], 
  [NA Inv Report].[Quantity]
FROM [NA Inv Report]   <-- Would be "EU Inv Report" for [EU Supply]
  WHERE ((([NA Inv Report].[Quantity])>0));

然后我有一个基本的联合查询,称为[uQuery: Combo]

SELECT 
  [Product Demand].[Date] AS [Date],
  [Product Demand].[Region] AS [Region],
  [Product Demand].[Product] AS [Product]
FROM [Product Demand]
UNION SELECT 
  [NA Supply].[Date] AS [Date],
  [NA Supply].[Region] AS [Region],
  [NA Supply].[Product] AS [Product]
FROM [NA Supply]
UNION SELECT 
  [EU Supply].[Date] AS [Date],
  [EU Supply].[Region] AS [Region],
  [EU Supply].[Product] AS [Product]
FROM [EU Supply];

然后,我将该联合查询拉入一个新查询;

SELECT 
  [uQuery: Combo].Date, 
  [uQuery: Combo].Region, 
  [uQuery: Combo].Product
FROM [uQuery: Combo];

这说明了一切!

但这是令人困惑的事情;如果我 LEFT JOIN Product Demand,它仍然显示一切。 但是如果我离开NA SupplyEU Supply 之一,那么它会将结果过滤到添加的表中。如果我添加两个供应表,则不会显示任何结果。

SELECT 
  [uQuery: Combo].Date, 
  [uQuery: Combo].Region, 
  [uQuery: Combo].Product
FROM (([uQuery: Combo] 
  LEFT JOIN [Product Demand] ON  <-- Adding just this will show everything
    ([uQuery: Combo].Product = [Product Demand].Product) AND 
    ([uQuery: Combo].Region = [Product Demand].Region) AND 
    ([uQuery: Combo].Date = [Product Demand].Date)) 
  LEFT JOIN [NA Supply] ON  <-- Adding this will only show matching results for [NA Supply]
    ([uQuery: Combo].Product = [NA Supply].Product) AND 
    ([uQuery: Combo].Region = [NA Supply].Region) AND 
    ([uQuery: Combo].Date = [NA Supply].Date)) 
  LEFT JOIN [EU Supply] ON  <-- Adding this will hide all results
    ([uQuery: Combo].Product = [EU Supply].Product) AND 
    ([uQuery: Combo].Region = [EU Supply].Region) AND 
    ([uQuery: Combo].Date = [EU Supply].Date);

【问题讨论】:

  • 替换为union all
  • @StevenBENET 这并不能解决问题。我还应该注意到,对于另一组表,我有一个几乎相同的 Union/Left-Join 组合,并且在没有UNION ALL SELECT 的情况下它可以完美地工作。澄清一下,我的 Union 查询确实显示了所有内容。只有当我将它用作 LEFT JOIN 查询的基础时,它才会开始隐藏结果。
  • 为什么你在联合查询中将相同的查询自加入到自己身上?你的最终结果是什么?这与XY Problem 相呼应,您在其中需要 Y 解决方案的帮助,但没有告诉我们 X 问题,并且 X 可能根本不需要 Y。
  • @Parfait 我有 3 个单独的报告要合并;需求(包括北美和欧盟),然后是北美供应和欧盟供应。我的想法是使用联合查询来获取所有可能的日期/地区/产品组合,以便我可以以此为基础向我展示每个日期/地区/产品的供应/需求摘要。

标签: sql ms-access left-join union


【解决方案1】:

所有结果都会消失,因为您强制 NA 和 EU 区域匹配它们永远不会匹配的结果,因为您将它们硬编码为不同的值。即使使用LEFT JOINNA Supply 也不会像逻辑上的"North America" &lt;&gt; "Europe" 那样返回任何行。

考虑分离出 DemandSupply 数据,然后加入最终查询,其中需求和供应区域之间可能存在匹配。

联合查询

SELECT 
  [NA Supply].[Date] AS [Date],
  [NA Supply].[Region] AS [Region],
  [NA Supply].[Product] AS [Product]
FROM [NA Supply]
UNION 
SELECT 
  [EU Supply].[Date] AS [Date],
  [EU Supply].[Region] AS [Region],
  [EU Supply].[Product] AS [Product]
FROM [EU Supply]

最终查询

SELECT 
  u.[Date], 
  u.Region, 
  u.Product,
  u.Quantity AS SupplyQty,
  p.Quantity AS DemandQty
FROM [uQuery: Combo] u
LEFT JOIN [Product Demand] p ON
  u.[Date] = p.[Date] AND 
  u.Region = p.Region AND 
  u.Product = p.Product

全外连接查询

现在,您可能希望完整的外部联接包含需求而不匹配供应。 由于 MS Access 不直接支持 FULL OUTER JOIN,因此您可以通过合并 RIGHT JOIN 来获得等效结果(假设两个表中都不存在重复行)。

SELECT u.[Date], u.Region, u.Product, u.Quantity As SupplyQty, p.Quantity As DemandQty
FROM [uQuery: Combo] u
LEFT JOIN [Product Demand] p ON
  u.[Date] = p.[Date] AND u.Region = p.Region AND u.Product = p.Product

UNION

SELECT u.[Date], u.Region, u.Product, u.Quantity, p.Quantity
FROM [uQuery: Combo] u
RIGHT JOIN [Product Demand] p ON
  u.[Date] = p.[Date] AND u.Region = p.Region AND u.Product = p.Product

ASIDE:理想情况下,您希望维护一个 供应来源或一个Inv Report,因为UNION可能会出现性能问题,尤其是在其他查询,例如使用 UNION 的建议的完全外连接。

在数据库模式中,您不希望为 NAEU 等不同类别复制结构,而是将相似的数据保留在具有数据值不同的指示字段的同一对象中。数据库表不是电子表格选项卡,而是规范化的相关逻辑数据分组,避免了冗余。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-28
    • 1970-01-01
    • 2018-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-05
    • 1970-01-01
    相关资源
    最近更新 更多