使用左外连接获取记录

时间:2012-06-11 10:35:45

标签: sql sql-server-2008

我有两张表,如下所示

    Table A                Table B             Table C              
  =============          ==============        =========
    Id    Name           Id   AId  CId         Id   Name 
    1     A              1    1    1           1    x
    2     B              2    1    1           2    y
    3     C              3    2    1           3    z 
    4     D              4    2    3           4    w
    5     E              5    3    2           5    v

现在我希望表A中的所有记录与表B中的Id列CId匹配,其中CId = 1。

所以输出应该如下:

Id Name CId
1   A   1 
2   B   1
3   C   1
4   D   Null
5   E   Null

有人能帮帮我吗?

2 个答案:

答案 0 :(得分:0)

这样做你想要的:

SELECT
A.Id,
A.Name,
CASE B.CId WHEN 1 THEN 1 ELSE NULL END AS CId
FROM
A LEFT JOIN B ON A.Id = B.Id

这与LEFT JOINing无关。你也可以用INNER JOIN来做。当您不希望显示列CId的3和2时,您仍然需要使用WHERE进行过滤,因此不会出现ID为4和5的行,这不是您想要的。 < / p>

编辑:

鉴于此测试数据:

create table A (Id int, Name varchar(5));
insert into A values 
(1, 'A'),
(2, 'B'),
(3, 'C'),
(4, 'D'),
(5, 'E');

create table B (Id int, AId int, CId int);
insert into B values
(1,1,1),
(2,1,1),
(3,2,1),
(4,2,3),
(5,3,2);

我的查询提供笛卡尔积。在downvoting之前阅读并尝试。无论如何,我不清楚你想要实现什么,现在我加入了AId专栏并使用了这个查询:

SELECT DISTINCT
A.Id,
A.Name
, CASE 
WHEN B.CId > 1 THEN 1 
WHEN B.CId = 1 THEN 1
ELSE NULL END AS CId
FROM
A LEFT JOIN B ON A.Id = B.AId

并且它也提供了正确的输出,就像之前的第一个一样。如果这仍然不是您想要的,那么您的测试数据是错误的,或者我绝对不会得到它。

答案 1 :(得分:-1)

尝试这样的事情:

SELECT TableA.Id, TableA.Name, TableB.CId
FROM TableA 
LEFT OUTER JOIN TableB ON TableA.Id = TableB.CId 
WHERE TableB.CId = 1 

希望这有帮助。

修改
如果您将TableA的ID列与TableB的ID列匹配, NOT TableB的CId列,则可以实现所需的输出。尝试下面我在我的电脑测试,并给你所需的类似输出。

select TableA.Id, TableA.Name, TableB.CId  
from TableA 
left outer join TableB on TableA.Id = TableB.Id 
and TableB.CId in 
(
select TableB.CId  
from TableB 
left outer join TableC on TableB.CId = TableC.Id 
WHERE TableB.CId = 1 
) 
group by TableA.Id, TableA.Name, TableB.CId  

如果我猜对了,请通知我。检查列名称。