当前位置: 首页 > 面试题库 >

奇怪的INNER JOIN语法和封装

阎德宇
2023-03-14
问题内容

我通常对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,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

第二查询

(多余的括号已删除)

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)到查询中),但对于外部联接则可以。



 类似资料:
  • 我有以下类型,在架构中定义为: 生成的JAXB类: 使用此类型的一些JAXB类: 当我将此XML解组为JAXB对象时: 这份名单从何而来?info_analytics映射到没有任何集合/数组的类型。 如果我得到这个JSON,umarshall将其转换为JAXB对象,marshall转换为XML,它将生成: 为什么元素作为属性重复? XML:

  • 问题内容: 在弄乱Eclipse中的自定义格式设置选项的同时,在示例代码之一中,我看到了如下代码: 我从未见过像这样使用过,并且我从事Java编程已有9年了!有谁知道你为什么要这么做?这样做的可能用例/好处是什么? 我看到的另一段代码,我认为这是一个非常有用的速记,因此我也在这里共享了它,它的作用很明显: 问题答案: 它是在Java 7中添加的。它称为try-with- resources 语句。

  • 我查看了Java SE API 1.8所做的一些更改,当我查看新方法map.merge时,它展示了一个如何将其与下面一行一起使用的示例 我了解如何使用lambda表达式创建匿名函数接口,但这似乎是使用一个方法作为一个双重功能。我喜欢理解和使用晦涩难懂的java语法,但我在任何地方都找不到这一点。

  • 问题内容: 我在es-discuss邮件列表中遇到了以下代码: 这产生 为什么这是代码的结果?这里发生了什么事? 问题答案: 了解此“ hack”需要了解几件事: 为什么我们不只是做 如何处理论点 如何处理多个参数 函数如何处理参数 是什么呢 它们是javascript中相当高级的主题,因此它的时间要长得多。我们将从顶部开始。系好安全带! 1.为什么不只是? 什么是数组,真的吗?包含整数键的常规对

  • 所以在过去的几个月里,我在一个特定的项目中使用了相当多的反应挂钩——这是我第一次看到这样的事情,我想知道是否有人对正在发生的事情有一个解释。 我有以下几点: 当代码到达console.log语句时,它说“setSectionDefects”是一个数组,“sectionDefects”是设置它的函数! 我的头脑已经崩溃了,我一辈子都搞不懂它——我学到的语法是先声明函数,然后设置变量- ie:cons

  • 我正在研究对Java SE API 1.8所做的一些更改,在研究新的方法map.merge时,它展示了如何与行一起使用它的示例 我理解如何使用一个lambda表达式来创建匿名函数接口,但这似乎是将一个方法用作双函数。我喜欢理解和使用晦涩难懂的java语法,但我在任何地方都找不到提到过这一个。