-2

我有两个表格,如下所示

    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

任何人都可以帮助我吗?

4

2 回答 2

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 的行不会出现,这不是您想要的。

编辑:

鉴于此测试数据:

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);

我的查询没有给出笛卡尔积。在投票之前阅读并尝试。无论如何,我不清楚你想要实现什么,现在我加入了 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

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

于 2012-06-11T10:43:44.240 回答
-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 列匹配,而不是 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  

如果我猜对了请告知。检查列名。

于 2012-06-11T10:42:26.720 回答