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

SQL Server:联接两个表,只获取一个表中没有相同行的数据,sql,sql-server,join,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

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

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
现在我只需要post表中的数据。我不需要评论表中的任何数据。 从post表获取数据的条件是,我需要有注释“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)
上面的查询将给出两个相同的行,postid1

PostId      Title
    1       First Post
    1       First Post
    3       Third post
现在我想删除其中一行。我尝试了
DISTINCT
,但我在Post表上的一列具有
text
数据类型,因此,
DISTINCT
不起作用。当I
GROUP BY p.PostId
SQL server要求对所有列执行相同操作时,select列表中的[column]
无效,因为它既不包含在聚合函数中,也不包含在GROUP BY子句中。请注意,post表有大量列,我不想将它们全部添加到
GROUPBY
语句中

除了使用
子查询中的WHERE之外,还有其他解决方案吗


更新:我在Youtube上找到了这段视频,它清楚地解释了存在的问题和我的问题:

对于分组,您需要对所有行进行分组,因为您按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)

对于分组,您需要对所有行进行分组,因为您按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)
试一试

试一试


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

因此,您不需要使用
JOIN

select p.*
from tblMstPost p
where p.PostId in (select PostId 
                   from tblTrnComment 
                   where Comment in ('Hi', 'Hello')
                   );
现在,我建议改为存在

select p.*
from tblMstPost p
where exists(select 1 
             from tblTrnComment c
             where c.PostId = p.PostId and 
                   c.Comment in ('Hi', 'Hello')
             );

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

因此,您不需要使用
JOIN

select p.*
from tblMstPost p
where p.PostId in (select PostId 
                   from tblTrnComment 
                   where Comment in ('Hi', 'Hello')
                   );
现在,我建议改为存在

select p.*
from tblMstPost p
where exists(select 1 
             from tblTrnComment c
             where c.PostId = p.PostId and 
                   c.Comment in ('Hi', 'Hello')
             );

为了避免出现
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

为了避免出现
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

添加clauseAdd的群组clauseAdd的群组我在Youtube上找到了这段视频,它清楚地解释了存在和我的问题:我在Youtube上找到了这段视频,它清楚地解释了存在和我的问题: