SQL Server:如何使用左外连接+依赖内连接进行查询?

时间:2010-12-06 11:27:08

标签: sql sql-server sql-server-2005

我面临着sql server 2005数据库中的连接问题。 我有以下表结构:

 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
如果没有与TableB记录关联的TableA记录,则

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

5 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

这表现得完全正常。您与TableC的链接是通过TableB进行的,因此如果没有TableB记录,则链接将不会连接。

同时将INNER JOIN更改为LEFT OUTER - 尽管有关数据确实是内在的。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

我认为这与JOIN操作的顺序有关。

(A LEFT OUTER JOIN B)INNER JOIN C的结果,你想要一个左外(B INNER JOIN C)。

尝试在那里删除一些()。

或尝试将你的JOIN重新排序为... B INNER C RIGHT OUTER A得到(B INNER C)右外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

注意:请原谅我,如果这不起作用,我从7版开始就没有触及SqlServer。

答案 4 :(得分: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