我对 SQL Server 2008 提出了一个非常简单的请求,但我无法成功实现我的目标。
的说明
我有以下架构:
对于给定的FAVORITE
,用户可以有0个或多个COMMENTs
,但是,如果用户有多个评论,则所有COMMENTs
都有DeletedDate
{ {1}}(可能是最后一个)
NOT NULL
充当标记" IsDeleted",应用程序确保每个用户每个用户只有零个或一个评论为DeletedDate
。如果NULL
为DeletedDate
,则该记录将被视为已删除。
但是,用户可以NULL
没有FAVORITE
。 COMMENT
完全是可选的。
我想要什么
我正在尝试创建一个请求,对于给定的用户,该请求将返回其所有有效收藏夹(其中COMMENT
为FAVORITE.DeleteDate
)和相关的有效NOT NULL
到COMMENT
(如果存在)。
这是我的要求:
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中出错了,COMMENT的第四行应该是
AND co.DeletedDate IS NOT NULL
请你改进我的要求吗?我必须在LINQ中编写它,但我应该能够从SQL转换为LINQ。
谢谢你的时间!
答案 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
'到' INNER JOIN
'为了不显示不同的用户。
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 null
和c.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