我通常非常精通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
但我得到了这个:
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
这是什么?只是另一种语法或性能技巧?
(这是在SQLServer上,仅供参考,但可能适用于其他人......)
答案 0 :(得分:6)
括号不会改变语义。 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
(删除了多余的括号)
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
在第一个示例中,逻辑首先发生Transaction, Product
上的联接,然后由此产生的虚拟表加入Customer
,而在第二个示例中,加入Transaction, Customer
首先发生,然后由此产生的虚拟表连接到Product
这只是逻辑上的,因为内部联接既是关联的又是可交换的,这可能不会对执行计划产生任何影响(除非你向查询添加OPTION (FORCE ORDER)
),但它可以用于外部联接。 / p>
这是covered by Itzik Ben Gan here,但文章有很多不准确之处,请参阅follow up letter by Lubor Kollar。