我有两张桌子: -
表1: -
ID1
1
1
1
1
4
5
表2: -
Id2
2
2
1
1
1
8
我想通过使用连接来显示table2中ID1中存在的所有ID2
我用过: -
select ID2 from Table2 t2 left join Table1 t1
on t2.Id2=t1.Id1
但这是重复的结果: -
Id2
1
1
1
1
1
1
1
它应该只显示1次为3次,因为它在表2中存在3次。
请帮忙。
答案 0 :(得分:2)
这是Join Operation的预期行为。它将匹配两个表中的每一行,因此在连接查询结果中将获得包含值1的12行。
您可以使用以下查询来获得所需的结果。
select ID2 from Table2 t2 WHERE ID2 IN (SELECT ID1 FROM Table1 t1)
答案 1 :(得分:2)
您将值1
与Table1
上的4行和Table2
上的3行匹配,这就是您看到12行的原因。您需要额外的JOIN
条件。您可以添加ROW_NUMBER
并执行INNER JOIN
以获得所需的结果。
WITH Cte1 AS(
SELECT *,
rn = ROW_NUMBER() OVER(PARTITION BY Id1 ORDER BY (SELECT NULL))
FROM Table1
),
Cte2 AS(
SELECT *,
rn = ROW_NUMBER() OVER(PARTITION BY Id2 ORDER BY (SELECT NULL))
FROM Table2
)
SELECT c2.Id2
FROM Cte2 c2
INNER JOIN Cte1 c1
ON c1.Id1 = c2.Id2
AND c1.rn = c2.rn
但是,您可以在不使用JOIN
的情况下获得所需的结果。
SELECT *
FROM Table2 t2
WHERE EXISTS(
SELECT 1 FROM Table1 t1 WHERE t1.Id1 = t2.Id2
)
答案 2 :(得分:2)
select id2 from table2 t2 where exists ( select 1 from table1 t1 where t1.id1 = t2.id2)
答案 3 :(得分:1)
您的连接逻辑工作正常,问题是您的每个ID2都与所有ID1匹配。一个简单的解决方案是加入一个具有不同ID1的表,以避免这种重复。
select
t2.ID2
from Table2 t2
left join (select distinct * from Table1) t1
on t1.Id1=t2.Id2
where t1.ID1 is not null
;
这将选择您的整个ID2列表,其中ID1填充在一列中。 ID1在没有匹配的地方为空。从此表中选择您的ID2列,但不要拉空值(使用where子句):