我面临着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
记录!
我错过了什么?
答案 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