2010-12-06 76 views
1

我在sql server 2005数据库中遇到了连接问题。 我有以下表结构:SQL Server:如何使用左外部联接+依赖内部联接进行查询?

TableA --LEFT JOIN--> TableB --INNER JOIN-->TableC 

所以,如果我写这样的查询:

SELECT TableA.* FROM TableA 
LEFT OUTER JOIN TableB ON TableA.keyOfB = TableB.key 
INNER JOIN TableC ON TableB.keyOfC = TableC.key 
where TableA.key = aValue 

它读取0记录,如果有不TableA记录相关联的任何TableB记录。 但TableB是在外连接,所以这不是我所期望的。换句话说,INNER JOIN不应该考虑因为没有任何TableB记录! 我错过了什么?

回答

1

我认为这与JOIN操作的顺序做。 (A LEFT OUTER JOIN B)INNER JOIN C,你想要一个左外部(B INNER JOIN C)。

试着在里面放一些()。

或者尝试重新安排你的连接来。B INNER c右键OUTER A地(B INNER C)RIGHT OUTER A.

编辑:什么,我在想 例:

SELECT TableA.* FROM TableA 
LEFT OUTER JOIN (TableB INNER JOIN TableC ON TableB.keyOfC = TableC.key) 
ON TableA.keyOfB = TableB.key 
WHERE TableA.key = aValue 

翻转至右外:

SELECT TableA.* FROM TableB 
INNER JOIN TableC ON TableB.keyOfC = TableC.key 
RIGHT OUTER JOIN TableA ON TableA.keyOfB = TableB.key 
WHERE TableA.key = aValue 

注:请原谅我,如果这是行不通的,因为版本我没碰过的SqlServer 7.

1

使用虚拟表进行(B + C)连接。
编辑:是这样的:

SELECT TableA.* FROM TableA 
LEFT OUTER JOIN 
    (select key from TableB INNER JOIN TableC ON TableB.keyOfC = TableC.key) as TableBC 
    ON TableA.keyOfB = TableBC.key 
where TableA.key = aValue 
+0

您可以修改Pier Luigi的代码,因为我不确定您的意思吗? – David 2010-12-06 11:34:19

1

这正是表现为它应该。与TableC的链接是通过TableB,因此如果没有TableB记录,链接将不会被连接。

更改INNER JOINLEFT OUTER - 虽然它确实是一个内在的,只要有关的数据。

1

如果您在没有INNER JOIN的情况下运行查询,那么所有带有TableB.key的记录都将为空,对吧?所以下一个INNER JOIN找不到任何匹配的记录,这就是为什么没有结果。

0

下面是代码,作为对表b和c使用左外连接的示例。

declare @TableA table (Adata1 char(2), Adata2 char(2)) 
declare @TableB table (Bdata1 char(2), Bdata2 char(2)) 
declare @TableC table (Cdata1 char(2), Cdata2 char(2)) 

;Insert @TableA 
Select 'A', 'A' union all 
Select 'B', 'B' union all 
Select 'C', 'C' 

;Insert @TableB 
Select 'Ab', 'Ab' union all 
Select 'B', 'B' union all 
Select 'C', 'C' 

;Insert @TableC 
Select 'A', 'A' union all 
Select 'B', 'B' union all 
Select 'Cb', 'Cb' 

--Select * From @TableA 
--Select * From @TableB 
--Select * From @TableC 

Select * from @TableA 
LEFT OUTER JOIN @TableB on Adata1 = Bdata1 
LEFT OUTER JOIN @TableC on Bdata1 = Cdata1 

结果是:

Adata1 Adata2 Bdata1 Bdata2 Cdata1 Cdata2 
A   A NULL NULL NULL NULL 
B   B B B B B 
C   C C Cb NULL NULL