【问题标题】:SQL Join For Nonexistant Rows不存在行的 SQL 连接
【发布时间】:2016-05-05 07:49:30
【问题描述】:

我有以下查询,但它只提取两个表中都存在的记录。如果 Table_Sold 中不存在记录,我该如何修改它以便它仍然拉取?

 SELECT  Col_1 ,
        Col_2 - Sold AS Remaining_Stock
FROM    Table_1
        JOIN ( SELECT   Col_3 ,
                        SUM(Col_2) AS Sold
               FROM     Table_2
               GROUP BY Col_3
             ) AS Table_Sold ON Table_1.Col_1 = Table_Sold.Col_3
                                AND Col_2 > Sold

【问题讨论】:

  • 这是用于哪个 rdbms 的?您标记了三个不同的。

标签: mysql sql sql-server postgresql


【解决方案1】:

您应该使用LEFT JOIN 而不是常规的JOIN

SELECT Col_1, Col_2 - coalesce(Sold, 0) AS Remaining_Stock
FROM Table_1
LEFT JOIN (
  SELECT Col_3, SUM(Col_2) AS Sold
  FROM Table_2
  GROUP BY Col_3) AS Table_Sold 
ON Table_1.Col_1 = Table_Sold.Col_3
   AND Col_2 > Sold; -- This last condition is probably ambiguous

【讨论】:

  • 我试过这个。这会从 Table_Sold 中拉出所有具有空值的记录。我只想要有剩余库存的记录。
  • 这不是你想要的。但是,如果我正确理解您的评论,那么更新的答案应该可以解决。使用LEFT JOIN,您可以从第一个表中获取所有行,并从连接表中获取相应的行。连接表的缺失行会得到 NULL 值,这会弄乱您的选择列表,因此您应该在 sold 字段中将 0 替换为 NULL
【解决方案2】:

这将是LEFT JOIN 的情况

SELECT Col_1, Col_2 - Sold as Remaining_Stock 
FROM Table_1 
LEFT JOIN (
   SELECT Col_3, SUM(Col_2) as Sold 
FROM Table_2 GROUP BY Col_3) as Table_Sold
ON Table_1.Col_1 = Table_Sold.Col_3 AND Col_2 > Sold

【讨论】:

    【解决方案3】:
    SELECT p.id, a.qty - ifnull(o.qty,0) remaining_stock
    FROM products p
    LEFT JOIN (
        SELECT product_id, sum(qty) qty
        FROM orders
        GROUP BY 1
    ) o ON p.id = o.product_id
    WHERE a.qty > o.qty
    

    【讨论】:

      猜你喜欢
      • 2017-04-25
      • 1970-01-01
      • 2021-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多