繁体   English   中英

SQL如何联接两个表,以便即使右边一个表中没有匹配的条目,结果中左边一个表的所有条目也都在结果中?

[英]How to SQL join two tables so that all entries of the left one are in the result even if there is no matching entry in the right one?

我已经花了几个小时解决这个SQL问题,我认为这很容易-我仍然认为应该解决,但对我来说显然不够容易(不是SQL专家)。 如果您能帮助我,我会很高兴。

在本示例中,我已将其简化。 想象两个表:

PRODUCT
 -ID
 -NAME

REVIEW
 -ID
 -PRODUCT_ID
 -USER_ID
 -CONTENT

每个用户只能评论一次产品。

我现在需要的是一个SQL查询,该查询返回所有产品以及给定用户的评论。 如果用户尚未审查产品,则应为审查列返回NULL值。

我认为可以进行以下操作,但显然不会,因为只有经过审核的产品才能退回。

SELECT p.*, r.* 
from PRODUCT p join REVIEW r 
  on r.PRODUCT_ID = p.ID 
where r.USER_ID=:userId

如果有人可以帮助我,我会很高兴。 我很确定必须涉及某种子选择,但是我似乎无法自己弄清楚它:(

顺便说一句:我需要将其翻译为HQL,因此该解决方案不应使用UNION之类的功能,而HQL不支持这些功能。

非常感谢您,彼得

SELECT p.*, r.* 
 from PRODUCT p LEFT JOIN REVIEW r 
  on r.PRODUCT_ID = p.ID 
 where r.USER_ID=:userId

嗯,发布此消息后,我终于在另一个站点上找到了答案。 (我曾经搜索过,我发誓;-)

诀窍不是在WHERE子句中具有userId限制,而是作为JOIN的一部分:

SELECT p.*, r.* 
from PRODUCT p LEFT JOIN REVIEW r 
  on r.PRODUCT_ID = p.ID AND r.USER_ID=:userId

感谢您的想法!

(编辑:也必须使用LEFT连接,如Martin Smith所指出的,谢谢!)

如果要选择没有用户创建评论的产品:

SELECT p.*, r.* from PRODUCT p join REVIEW r on r.PRODUCT_ID = p.ID
WHERE r.USER_ID IS NULL

如果要选择未创建特定评论的产品:

SELECT p.*, r.* from PRODUCT p join REVIEW r on r.PRODUCT_ID = p.ID
WHERE r.USER_ID IS NULL or r.USER_ID!=:userId

为了获得您所描述的效果,您应该使用一个left outer join ,但是用一个匹配的用户ID或null来限制您的右手边。

SELECT p.*, r.* 
 from PRODUCT p LEFT OUTER JOIN REVIEW r 
  on r.PRODUCT_ID = p.ID 
 where r.USER_ID=:userId or r.USER_ID is null

使用子查询的另一个方法

从产品P左联接中选择P. ,R.(从*那里查看*从用户ID =:用户ID)UR在UR.ProductId = P.ID

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM