我有两张表,如下所示
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
有人能帮帮我吗?
答案 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
如果我猜对了,请通知我。检查列名称。