1

我对SQL Server 2008有一个非常简单的请求,但我无法成功实现我想要的。

说明
我有以下架构:

架构 SQL

对于给定FAVORITE的 ,用户可以有零个或多个COMMENTs,但是,如果用户有多个评论,则所有评论COMMENTs都有一个DeletedDate NOT NULL(可能最后一个除外)。

DeletedDate充当标志“IsDeleted”,应用程序确保每个用户每个收藏夹只有零或一个评论是NULL. 如果DeletedDateNULL,则该记录被视为已删除。

但是用户可以FAVORITE没有COMMENT. COMMENT是完全可选的。

我想要什么


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

这是我的要求:

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进行测试)

但是,此请求返回所有COMMENTs用户FAVORITEs7,甚至DeletedDate是 NOT NULL 的注释。

我试图AND co.DeletedDate IS NOT NULL在上面的请求中添加一个,但是现在,它没有返回没有任何 COMMENT


FIDDLE的 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。
感谢您的时间 !

4

3 回答 3

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)
于 2014-06-24T12:56:09.653 回答
0

如果我正确理解了您的问题。您可以使用SQLFiddleEXISTS检查是否有这样的记录

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)
于 2014-06-24T12:55:16.827 回答
0

此查询将返回收藏夹表中的所有记录,无论是否有匹配的评论(左连接)以及 where f.DeletedDate is not nullAND wherec.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
于 2014-06-24T12:55:41.510 回答