【问题标题】:Query to bring back Records from left table if not in right table如果不在右表中,则查询从左表带回记录
【发布时间】:2014-12-15 21:47:04
【问题描述】:

想象一下有一个 Stores 表:

  • 身份证
  • 商店编号
  • 分公司名称

想象有另一个“SalesData”表:

  • 身份证
  • 年份
  • 商店编号
  • 获得的金额

Stores 表总是被填充。 SalesData 不是。它仅在何时填充。

我正在努力提出以下查询,如果在给定的月份和年份没有记录,并且 AmountAquired 为空,它将为每个商店返回结果。

同时,另一个增加的复杂性(可能是单独的查询)是在哪里带回销售数据中没有数据的所有商店(使用 StoreNumber 上的连接),但如果有数据则只带回有数据的那家商店的行,而忽略该商店没有数据的那一行。

我尝试了左外连接和右外连接,但没有成功。

SELECT s.* FROM Stores s
LEFT OUTER JOIN SalesData sd ON
sd.StoreNumber = s.StoreNumber
WHERE sd.Year = 2014 AND sd.Month = 11 AND sd.AmountAquired IS NULL.

这只会带回年份和月份为 2014 和 11 的记录(这并不奇怪,因为这是我在 where 子句中写的!)

我想要它让我返回销售数据中没有数据的记录,或者月份和年份与给它的参数匹配的地方(而不是任何其他月份或任何其他年份,除非列值中有 NULL )

它应该总是带回数据(几乎来自商店表以显示所有商店......以及在销售数据表中找不到的任何数据(或者即使给定月份和年份的数据也存在)对于没有数据的商店)

希望这是有道理的。

【问题讨论】:

  • 愚蠢的问题,但你试过做第二个和一个或吗?
  • @AxGryndr - 是的,我相信是的。听起来不错。

标签: sql sql-server


【解决方案1】:

您对此类查询使用LEFT OUTER JOIN 是正确的。您犯的错误是在执行LEFT OUTER JOIN 时,您需要将与右表相关的过滤器移动到连接on 部分。

仅获取缺少 2014 年 11 月销售的商店:

SELECT s.* 
FROM Stores s
LEFT OUTER JOIN SalesData sd ON
sd.StoreNumber = s.StoreNumber
AND sd.Year = 2014 AND sd.Month = 11
WHERE sd.AmountAquired IS NULL --no sales are found

要获得 2014 年 11 月的所有销售额,包括没有销售额的商店,您可以这样做:

SELECT s.* 
FROM Stores s
LEFT OUTER JOIN SalesData sd ON
sd.StoreNumber = s.StoreNumber
AND sd.Year = 2014 AND sd.Month = 11

【讨论】:

  • 谢谢。我会试试看。
  • 除了指定月份和年份的记录之外,还没有指定年份或月份的记录,当我的意思是未指定时,我的意思是年份和月份为空的地方跨度>
  • 我更新了答案以包含这种情况,请参阅第二条选择语句
  • 我相信这符合我的要求。已确认为答案,但稍后可能会返回进一步查询。干得好
  • 如果年份和月份为 null 是 SalesData,并且您希望这些记录也返回,您需要将它们添加到 LEFT JOIN(不是 WHERE 子句)中的条件,即(sd .Year 为 NULL 或 sd.Year = 2014)和(sd.Month 为 NULL 或 sd.Month = 11)。 (注意括号)这将返回 SalesData 中年份为 NULL 或 2014 等的匹配记录。
【解决方案2】:

你不能只为第二种情况切换到 OR 吗?

(sd.Year = 2014 AND sd.Month = 11) OR sd.AmountAquired IS NULL

在第一个示例中,您要求 “在给定的月份和年份没有记录,并且 AmountAquired 为空” - 但如果没有记录,则 AmountAquired 必然为 NULL。

那个查询很简单:

SELECT
  s.*
FROM
  Stores s
  LEFT OUTER JOIN SalesData sd ON sd.StoreNumber = s.StoreNumber
WHERE
  sd.StoreNumber IS NULL

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-22
    • 1970-01-01
    • 1970-01-01
    • 2014-10-30
    • 2021-04-03
    • 1970-01-01
    相关资源
    最近更新 更多