SQL - 使用连接列和条件连接2个表

时间:2014-06-24 12:47:54

标签: sql sql-server sql-server-2008 left-join sqlfiddle

我对 SQL Server 2008 提出了一个非常简单的请求,但我无法成功实现我的目标。

说明
我有以下架构:

Schema SQL

对于给定的FAVORITE,用户可以有0个或多个COMMENTs,但是,如果用户有多个评论,则所有COMMENTs都有DeletedDate { {1}}(可能是最后一个)
NOT NULL充当标记" IsDeleted",应用程序确保每个用户每个用户只有零个或一个评论为DeletedDate。如果NULLDeletedDate,则该记录将被视为已删除。

但是,用户可以NULL没有FAVORITECOMMENT完全是可选的。

我想要什么


我正在尝试创建一个请求,对于给定的用户,该请求将返回其所有有效收藏夹(其中COMMENTFAVORITE.DeleteDate)和相关的有效NOT NULLCOMMENT(如果存在)。

这是我的要求:

FAVORITED

(请使用IdUser = 7进行测试)

但是,此请求会返回用户7的所有SELECT * FROM FAVORITE f LEFT JOIN COMMENT co ON f.IdReferenced = co.IdReferenced WHERE f.IdUser = 7 AND f.DeletedDate IS NULL AND co.IdUser = 7 的所有COMMENTs,甚至FAVORITEs为非NULL的注释。

我尝试在上述请求中添加DeletedDate,但现在,它没有返回最喜欢的收藏夹


FIDDLE


为了重现这个问题,我创建了这个SQLFIDDLE



擅自结果

<小时/> 如果我在解释中没有清楚,请求必须返回我的SQLFIDDLE的四行,其中CommentText字段为&#34;必须出现1&#34;,&#34;必须出现2&#34;,& #34;必须出现3&#34;,&#34;必须出现4&#34;

Attempted result

请求必须返回上面的行,减去红线

重要 我刚刚在我的SQLFIDDLE中出错了,COMMENT的第四行应该是

AND co.DeletedDate IS NOT NULL

请你改进我的要求吗?我必须在LINQ中编写它,但我应该能够从SQL转换为LINQ。
谢谢你的时间!

3 个答案:

答案 0 :(得分:1)

如果我了解您的要求,您需要将正确表格co.DeletedDate IS NOT NULL)的条件放在查询的JOIN部分中,如:

SELECT *
FROM FAVORITE f
INNER JOIN COMMENT co ON f.IdReferenced = co.IdReferenced
AND co.DeletedDate IS NULL
AND co.IdUser = f.IdUser
WHERE f.IdUser = 7
  AND f.DeletedDate IS NULL

编辑: 在你的sql小提琴中,下面的行在DeletedDate中插入了一个值。如果此值为null,则上述查询会给出所需的结果。也改变了LEFT JOIN&#39;到&#39; INNER JOIN&#39;为了不显示不同的用户。

INSERT [dbo].[COMMENT] ([IdComment], [IdUser], [IdReferenced], [CommentText], [CreationDate], [ModificationDate], [DeletedDate]) VALUES (8, 7, 2869, N'Must appear 3', CAST(0x0000A33500EC1133 AS DateTime), NULL, NULL)

答案 1 :(得分:0)

如果我理解你的问题。您可以使用EXISTS检查是否有此类记录SQLFiddle

SELECT *
FROM FAVORITE f
LEFT JOIN COMMENT co ON f.IdReferenced = co.IdReferenced
WHERE f.IdUser = 7
  AND f.DeletedDate IS NULL
  AND  EXISTS ( SELECT 1 FROM COMMENT WHERE COMMENT.IdUser = co.IdUser AND co.DeletedDate IS NULL)

答案 2 :(得分:0)

此查询将返回收藏表中的所有记录,是否存在匹配的评论(左连接)以及f.DeletedDate is not nullc.CommentText in (values)

的位置
Select * from favorite f
left join comment c on c.IdReferenced = f.IdReferenced
                    and f.DeletedDate is null 
where c.CommentText in ('Must appear 1', 'Must appear 2','Must appear 3','Must appear 4')
      and f.IdUser = 7
--can use an OR statement as well