我有两个表,而不是实际的表,我试图在这里复制情况:
tblMstPost ,其中包含大量列(例如20)。我在这里只添加两个。
PostId Title
1 First Post
2 Second Post
3 Third post
tblTrnComment
CommentId PostId Comment
1 1 Hello
2 1 Hi
3 1 Hey
4 2 Test
5 3 Hello
现在,我只想从帖子表中获取数据。我不需要评论表中的任何数据。 从帖子表获取数据的条件是我需要带有评论“ Hello”和“ Hi”的帖子。
现在我可以这样写:
SELECT p.*
FROM tblMstPost AS p
INNER JOIN tblTrnComment AS c
ON p.PostId = c.PostId
WHERE c.CommentId IN (1, 2, 5)
上面的查询将给出带有PostId 1的两个相同行的结果。
PostId Title
1 First Post
1 First Post
3 Third post
现在,我要删除相同的行之一。我已经尝试过DISTINCT
,但是Post表上的其中一列具有text
数据类型,因此,DISTINCT
无法正常工作。当我GROUP BY p.PostId
时,SQL Server对所有列都询问相同的内容:[列] is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause
。请注意,post表中有很多列,我不想将所有列都添加到GROUP BY
语句中。
除了使用WHERE IN
子查询之外,还有其他解决方案吗?
更新:我在YouTube上发现了该视频,该视频清楚地说明了存在的视频以及我的问题:https://youtu.be/zfgJ3ZmAgNw
答案 0 :(得分:2)
尝试
#with_attached_As
答案 1 :(得分:1)
JOIN
可能会产生重复的行,因为tblTrnComment
表中有许多行与PostId
表中的tblMstPost
相关。因此,您需要的是IN
或EXISTS
因此,您无需使用JOIN
select p.*
from tblMstPost p
where p.PostId in (select PostId
from tblTrnComment
where Comment in ('Hi', 'Hello')
);
现在,我建议改用EXISTS
select p.*
from tblMstPost p
where exists(select 1
from tblTrnComment c
where c.PostId = p.PostId and
c.Comment in ('Hi', 'Hello')
);
答案 2 :(得分:0)
要进行分组,您需要对所有行进行分组,因为按id进行分组,编译器不知道该如何处理标题,是否对它们进行分组,是否应该将所有行进行汇总。因此您可以按如下所示列出组中所有未聚合的列。
SELECT p.*
FROM tblMstPost AS p
INNER JOIN tblTrnComment AS c
ON p.PostId = c.PostId
GROUP BY PostId, Title
WHERE c.CommentId IN (1, 2, 5)
答案 3 :(得分:0)
为避免使用WHERE IN
子句,您可以加入具有适当注释的一组不同的Post ID:
SELECT p.*
FROM tblMstPost p
JOIN ( SELECT DISTINCT PostId
FROM tblTrnComment
WHERE Comment = 'Hello'
OR Comment = 'Hi' -- Or have an IN here, or a lookup etc
) t
ON p.PostId = t.PostId