【问题标题】:SQL Server: Join two tables and only get data of one table without identical rowsSQL Server:连接两张表,只获取一张表的数据,没有相同的行
【发布时间】:2018-06-21 13:58:04
【问题描述】:

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

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)

上面的查询将给出两个相同行且 PostId 为 1 的结果。

PostId      Title
    1       First Post
    1       First Post
    3       Third post

现在我想删除相同的行之一。我已经尝试过DISTINCT,但我在 Post 表上的一列具有text 数据类型,因此,DISTINCT 不起作用。当我GROUP BY p.PostId SQL 服务器对所有列提出相同的要求时:[column] 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

【问题讨论】:

  • 添加 group by 子句

标签: sql sql-server join


【解决方案1】:

试试

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

【讨论】:

    【解决方案2】:

    JOIN 可能会产生重复的行,因为tblTrnComment 表有很多行与来自tblMstPost 表的PostId 相关联。所以,你需要的是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')
                 );
    

    【讨论】:

    • 我在 Youtube 上找到了这个视频,它清楚地解释了存在和我的问题:youtu.be/zfgJ3ZmAgNw
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      为避免出现WHERE IN 子句,您可以加入一组具有相应评论的不同帖子 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-08-29
        • 2015-05-29
        • 2011-09-30
        • 2017-07-17
        • 2016-11-27
        • 1970-01-01
        • 2017-04-26
        • 1970-01-01
        相关资源
        最近更新 更多