fos*_*ool 2 sql sql-server sql-server-2008-r2
第5行和第11行的括号是什么?
1 SELECT
2 s.name, s.ShirtDescription, c.Color,
3 z.Size, i.AvailableQTY, i.UnitPrice
4 FROM
5 (
6 test.ShirtInventory i
7 join test.Colors c ON
8 i.ColorID = c.id
9 join test.Shirts s ON
10 i.ShirtID = s.ID
11 )
12 JOIN test.Sizes z ON
13 i.SizeID = z.ID
14 WHERE .....
Run Code Online (Sandbox Code Playgroud)
我从未在FROM子句中看到过以这种方式使用的括号.这不是一个子查询,它没有确定表和连接的范围.您可以看到我在括号外引用i.SizeID的位置.当我第一次看到它时,我认为这可能是一种"提示"SQL Server如何获取数据的方法,但是当你删除parens时,执行计划中没有任何变化.
期待您的回复.编辑:错误的行
在这种情况下,作为内部联接的任何内容都不是关联的和可交换的.
通常,您可以通过移动on子句的位置来更改参与连接的虚拟表,这可以应用可选的括号,以期使事情更清晰.
因此,例如,你可以有
SELECT P.PersonName,
Pt.PetName,
Pa.AccessoryName
FROM Persons P
LEFT JOIN Pets Pt
INNER JOIN PetAccessories Pa
ON Pt.PetName = Pa.PetName
ON P.PersonName = Pt.PersonName;
Run Code Online (Sandbox Code Playgroud)
也可以选择编写
SELECT P.PersonName,
Pt.PetName,
Pa.AccessoryName
FROM Persons P
LEFT JOIN (Pets Pt
INNER JOIN PetAccessories Pa
ON Pt.PetName = Pa.PetName)
ON P.PersonName = Pt.PersonName;
Run Code Online (Sandbox Code Playgroud)