[英]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.