【发布时间】:2014-06-24 12:47:53
【问题描述】:
我对 SQL Server 2008 有一个非常简单的请求,但我无法成功实现我想要的。
说明
我有以下架构:
对于给定的FAVORITE,一个用户可以有零个或多个COMMENTs,但是,如果用户有多个评论,则所有COMMENTs 都有一个DeletedDate NOT NULL(可能最后一个除外).DeletedDate 充当标志“IsDeleted”,应用程序确保每个用户每个收藏夹只有零或一条评论是NULL。如果DeletedDate为NULL,则认为该记录已删除。
但用户可以拥有FAVORITE 而没有COMMENT。 COMMENT 是完全可选的。
我想要什么
我正在尝试创建一个请求,对于给定用户,该请求将返回其所有有效的收藏夹(其中FAVORITE.DeleteDate 是NOT NULL)和与FAVORITED 关联的有效COMMENT(如果它存在)。
这是我的要求:
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
(请使用IdUser = 7进行测试)
但是,此请求返回用户 7 的所有 FAVORITEs 中的所有 COMMENTs,甚至包括 DeletedDate 不为 NULL 的 cmets。
我尝试在上述请求中添加AND co.DeletedDate IS NOT NULL,但现在它没有返回没有任何评论的 FAVORITEs
小提琴
为了重现问题,我创建了这个SQLFIDDLE
尝试的结果
如果我的解释不清楚,请求必须返回我的 SQLFIDDLE 的四行,其中 CommentText 字段是“必须出现 1”、“必须出现 2”、“必须出现 3”、“必须出现 4”
请求必须返回上述行,减去红叉线
重要 我刚刚在我的 SQLFIDDLE 中出错了,COMMENT 的第四行应该是
INSERT [dbo].[COMMENT] ([IdComment], [IdUser], [IdReferenced], [CommentText], [CreationDate], [ModificationDate], [DeletedDate]) VALUES (8, 7, 2869, N'Must appear 3', CAST(0x0000A33500EC1133 AS DateTime), NULL, NULL)
您能改进我的要求吗?我必须用 LINQ 编写它,但我应该能够从 SQL 转换为 LINQ。
感谢您的宝贵时间!
【问题讨论】:
-
将所有对 co 的引用移出 WHERE 子句并进入 JOIN 条件。如果没有这个,您实际上是在将 LEFT OUTER JOIN “制作”为 INNER JOIN 条件。
-
为什么要显示“必须出现3”?
-
请检查您的 sqlfiddle,因为数据似乎无效
-
好吧,我真的很抱歉你是对的,“Must Appear3”必须有 DeletedDate = NULL,但是我复制/粘贴了一个日期时间,所以它不是 null 是我的小提琴。完全对不起。我会检查你的答案:-)
标签: sql sql-server sql-server-2008 left-join sqlfiddle