SQL Server:联接两个表,只获取一个表中没有相同行的数据
我有两个表,不是实际的表,我试图在这里复制这种情况: tblMstPost包含大量列(比如20列)。我在这里只加了两个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
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
不起作用。当IGROUP 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上找到了这段视频,它清楚地解释了存在和我的问题: