MPe*_*ier 6 sql sql-server inner-join
我通常非常精通JOINS,但这是新的.
假设有三个表(两个表的经典案例和第三个链接器表):
Customer Product Transaction
-------- ------- -----------
ID ID CustomerID
Name Desc ProductID
Cost Date
(简单的故意,我不能重现实际的结构,这不是我的代码.)
通常情况下,为了得到"谁买什么时候"的表格,我会这样做:
SELECT Customer.Name, Product.Desc, Transaction.Date
FROM Product
INNER JOIN Transaction ON Transaction.ProductID = Product.ID
INNER JOIN Customer ON Transaction.CustomerID = Customer.ID
Run Code Online (Sandbox Code Playgroud)
但我得到了这个:
SELECT Customer.Name, Product.Desc, Transaction.Date
FROM Product
INNER JOIN ( Transaction
INNER JOIN Customer ON Transaction.CustomerID = Customer.ID)
ON Transaction.ProductID = Product.ID
Run Code Online (Sandbox Code Playgroud)
这是什么?只是另一种语法或性能技巧?
(这是在SQLServer,FYI,但可能是可以应用于其他人......)
括号不会改变语义.ON子句的位置控制连接的逻辑处理顺序.
SELECT Customer.Name,
Product.Desc,
Transaction.Date
FROM Product
INNER JOIN Transaction
ON Transaction.ProductID = Product.ID
INNER JOIN Customer
ON Transaction.CustomerID = Customer.ID
Run Code Online (Sandbox Code Playgroud)
(删除了多余的括号)
SELECT Customer.Name,
Product.Desc,
Transaction.Date
FROM Product
INNER JOIN Transaction
INNER JOIN Customer
ON Transaction.CustomerID = Customer.ID
ON Transaction.ProductID = Product.ID
Run Code Online (Sandbox Code Playgroud)
所以逻辑上在你的第一个例子中,首先Transaction, Product发生连接,然后将连接发生,然后Customer在你的第二个例子中Transaction, Customer首先发生连接,然后由此产生的虚拟表连接到Product
这只是逻辑上的,因为内部联接既是关联的又是可交换的,这可能不会对执行计划产生任何影响(除非您添加OPTION (FORCE ORDER)到查询中),但它可以用于外部联接.
Itzik Ben Gan在此对此进行了介绍,但该文章有许多不准确之处,请参阅Lubor Kollar的后续信函.
| 归档时间: |
|
| 查看次数: |
515 次 |
| 最近记录: |