SQL Server:联接两个表,仅获得一个表中没有相同行的数据

时间:2018-06-21 13:58:05

标签: sql sql-server join

我有两个表,而不是实际的表,我试图在这里复制情况:

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

4 个答案:

答案 0 :(得分:2)

尝试

#with_attached_As

答案 1 :(得分:1)

JOIN可能会产生重复的行,因为tblTrnComment表中有许多行与PostId表中的tblMstPost相关。因此,您需要的是INEXISTS

因此,您无需使用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