【问题标题】:What are the parentheses doing in this SQL Statement in the FROM CLAUSE (TSQL)FROM CLAUSE (SQL) 中的这个 SQL 语句中的括号是做什么的
【发布时间】:2016-04-27 21:05:46
【问题描述】:

第 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 .....

我从未见过在 FROM 子句中以这种方式使用括号。这不是子查询,也不是表和连接的范围。您可以看到我在括号外引用 i.SizeID 的位置。当我第一次看到它时,我认为这可能是一种向 SQL Server “提示”您希望如何获取数据的方式,但是当您删除括号时,执行计划没有任何变化。

期待您的回复。 编辑:弄错了行

【问题讨论】:

  • 这是来自代码生成器吗?这可以解释无用的括号
  • @Hogan 不确定,代码来自界面应用程序中的第三方。我必须修改 SQL,并想确保我没有破坏我不理解的东西。

标签: sql sql-server sql-server-2008-r2


【解决方案1】:

在这种情况下,没有什么是内连接是关联的和可交换的。

一般来说,您可以通过移动on 子句的位置来更改参与连接的虚拟表,这也可以应用可选的括号以希望使事情更清晰。

所以for example 你可以拥有

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;

也可以写成可选的

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;

【讨论】:

  • 或另一种说法是——这些括号是默认的,如果它们被移动,那么可能会导致变化。
  • 感谢马丁的澄清。回想一下,正如您所提到的,我过去曾看到与外部联接一起使用的括号。我越是考虑围绕这个烂摊子的情况,我就越认为@Hogan 可能会考虑到他对某个地方的自动化脚本工具的想法。
【解决方案2】:

这是一个子查询,它将括号内的所有内容视为基表。在这种情况下,它看起来没有必要,因为它刚刚加入决赛桌

【讨论】:

  • 那不是派生表。派生表需要括号内的完整 Select 语句。这些括号什么都不做。也许它们是在括号内有完整的 Select 语句时遗留下来的。
  • 是的,没注意到。你是完全正确的,谢谢你修复那个。
  • 当我第一次看到这个时,我也在想同样的事情,Rich。直到我注意到随后的 JOINS 引用了括号内的表,我才知道这不是子查询,感谢您的输入。
猜你喜欢
  • 2010-09-14
  • 1970-01-01
  • 2016-04-17
  • 1970-01-01
  • 1970-01-01
  • 2011-02-14
  • 2012-03-31
  • 1970-01-01
相关资源
最近更新 更多