为不完整的sql联接提供默认值

hmmo2u0o  于 2021-08-13  发布在  Java
关注(0)|答案(2)|浏览(311)

抱歉,我不知道“不完全联接”是否有合适的名称,但请考虑这种查询,它旨在返回每次销售的详细信息:

SELECT a.id, a.productId, b.productDescription FROM Sales a, AdditionalProductData b WHERE a.productId = b.productId;

在这种情况下 AdditionalProductData 并不能保证每个人都会吵架 productId ,但我想为中的每一行返回一个结果 Sales ,如何修改查询以返回 null 或某些默认值,例如在这种情况下“未知”?我想确保未注册产品的销售不被遗漏。
(这是一个稍微做作的例子,表明db中存在问题,但这些问题超出了问题的范围)

5jvtdoz2

5jvtdoz21#

使用 OUTER JOIN :

SELECT a.productId, b.productName
FROM Products b LEFT JOIN
     Sales a
     ON a.productId = b.id;

但我想为销售中的每一行返回一个结果
执行表交换:

SELECT a.productId, COALESCE(b.productName, 'unknown') AS productName
FROM  Sales a LEFT JOIN
      Products b
      ON a.productId = b.id;
u3r8eeie

u3r8eeie2#

不要在句子中使用逗号 FROM 条款。始终使用适当的、明确的、标准的、可读的 JOIN 语法。
你想要一个 left join :

SELECT p.id, p.productName
FROM Products p LEFT JOIN
     Sales s
     ON s.productId = p.id;

我猜你真的希望每个产品至少有一行。对于不存在的产品进行销售是没有意义的——至少在大多数数据库中是这样。
上面这些没有意义——只能从一个表中选择。你可能想要这样的东西:

SELECT p.id, p.productName, SUM(s.amount)
FROM Products p LEFT JOIN
     Sales s
     ON s.productId = p.id
GROUP BY p.id, p.productName;

编辑:
如果你真的想要一排 sales ,那么你还想要一个 LEFT JOIN 另一个顺序是:

SELECT s.*, p.productName
FROM Sales s LEFT JOIN
     Products p L
     ON s.productId = p.id;

相关问题