左连接空值概念

3wabscal  于 2021-08-09  发布在  Java
关注(0)|答案(2)|浏览(198)

我有“产品”和“产品翻译”表“产品翻译”表有:id、产品id、区域设置、名称字段。
现在我想选择这样的产品和翻译:

SELECT * FROM products AS P
LEFT JOIN product_trs Ptr on P.id = Ptr.product_id
WHERE locale = 'fr'

但问题是,如果产品还没有翻译,这些产品就不会被退回。
例如,假设我的产品包含以下行:

id  pr_id locale    name
------------------------------
1    1    'en'    'product 1'
2    1    'fr'    'produit 1'
3    2    'en'    'product 2'

现在如果我选择

WHERE locale = 'en'

如果使用以下命令运行查询,我将得到2行:

WHERE locale = 'fr'

我去坐一排
我总是想要两排。即使我没有翻译。我该怎么做?

ve7v8dk2

ve7v8dk21#

你需要把这个条件移开 where 条款 on 条款:

SELECT *
FROM products P LEFT JOIN
     product_trs Ptr 
     ON P.id = Ptr.product_id AND ptr.locale = 'fr';

否则,过滤将在 left join --以及 locale 那么 NULL 这不符合比较。
一般的规则是在 left join 进入 where 条款。第二个(及后续)表上的过滤器位于 on 条款。

vi4fp9gy

vi4fp9gy2#

当您在“where”中编写筛选器时,记录将从结果中删除,但如果您将其置于“join condition”中,则记录只是从表中筛选,而不是从结果中筛选,并返回null。所以戈登的回答是正确的。

SELECT *
FROM products P LEFT JOIN
 product_trs Ptr 
 ON P.id = Ptr.product_id AND ptr.locale = 'fr';

相关问题