SQL Complex连接没有给出明显的结果

时间:2016-05-27 03:19:58

标签: sql sql-server sql-server-2008 join

我有两张桌子: -

表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次。

请帮忙。

4 个答案:

答案 0 :(得分:2)

这是Join Operation的预期行为。它将匹配两个表中的每一行,因此在连接查询结果中将获得包含值1的12行。

您可以使用以下查询来获得所需的结果。

select ID2 from Table2 t2 WHERE ID2 IN (SELECT ID1 FROM Table1 t1)

答案 1 :(得分:2)

您将值1Table1上的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
;

Here is a functional example

这将选择您的整个ID2列表,其中ID1填充在一列中。 ID1在没有匹配的地方为空。从此表中选择您的ID2列,但不要拉空值(使用where子句):