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

SQL连接格式-嵌套内部连接

谢骏奇
2023-03-14
问题内容

我在重构的旧系统中有以下SQL语句。这是此问题的缩写视图,只是暂时返回count(*)。

SELECT COUNT(*)
FROM Table1 
    INNER JOIN Table2 
        INNER JOIN Table3 ON Table2.Key = Table3.Key AND Table2.Key2 = Table3.Key2 
    ON Table1.DifferentKey = Table3.DifferentKey

它会生成大量记录并杀死系统,但是有人可以解释其语法吗?可以用其他任何方式表达吗?

  • 表1包含419行
  • 表2包含3374行
  • Table3包含28182行

编辑:

建议重新格式化

SELECT COUNT(*)
FROM Table1 
    INNER JOIN Table3
          ON Table1.DifferentKey = Table3.DifferentKey
    INNER JOIN Table2 
          ON Table2.Key = Table3.Key AND Table2.Key2 = Table3.Key2

问题答案:

为了提高可读性,我重新构造了查询…从表1的最顶层开始,然后将其绑定到Table3,然后将table3绑定到table2。如果遵循关系链,则容易遵循得多。

现在,回答您的问题。笛卡尔积的结果是,您得到的数量很大。对于表1中与表3匹配的每个记录,您将得到X
*Y。然后,对于表3和表2之间的每个匹配将具有相同的影响… Y * Z …因此,对于表1中仅一个可能的ID的结果可以有X * Y * Z记录。

这是基于不知道您的表的规范化或内容如何…键是否为PRIMARY键。

Ex:
Table 1       
DiffKey    Other Val
1          X
1          Y
1          Z

Table 3
DiffKey   Key    Key2  Tbl3 Other
1         2      6     V
1         2      6     X
1         2      6     Y
1         2      6     Z

Table 2
Key    Key2   Other Val
2      6      a
2      6      b
2      6      c
2      6      d
2      6      e

因此,在这种情况下,表1与表3的连接将得到12条记录(每1条记录与3条记录中的每条联接)。然后,再次返回表2中的每个匹配记录(5条记录)…总共60(3
tbl1 * 4 tbl3 * 5 tbl2)计数。

因此,现在,根据您的1000条记录进行扩展,您会看到混乱的结构如何使母牛(扼要说话)窒息并降低性能。

SELECT
      COUNT(*)
   FROM
      Table1 
         INNER JOIN Table3
            ON Table1.DifferentKey = Table3.DifferentKey
            INNER JOIN Table2
               ON Table3.Key =Table2.Key
               AND Table3.Key2 = Table2.Key2


 类似资料:
  • 我试图在一个视图中加入3个表;情况是这样的: 我有一张表格,里面有申请住在这所大学校园的学生的信息。我有另一个表,列出了每个学生的霍尔偏好(其中3个)。但是这些首选项中的每一个仅仅是一个ID号,而该ID号在第三个表中有一个对应的Hall名称(没有设计这个数据库……)。 基本上,我在表上有和它们的首选项以及它们的信息,结果类似于... 其中将是。所以现在我要将与第三个表匹配,其中该表包含和。 所以,

  • 问题内容: 好的,这是。我有两个表:product和product_sizes 所以基本上我的产品表具有id(主键),名称(产品名称)和size_id(product_sizes中的外键) 我的product_sizes表具有预定值: 在这里,我有一个有效的代码来显示产品表(使用while代码以html格式): 我的问题是我想显示(用html表示)尺寸名称而不是其size_id,类似于以下示例:

  • 我对Hibernate不太熟悉。谁能帮我解决代码中出现的错误。 我正在使用Eclipse Helios,Hibernate 3 生成的类和配置文件,如: Emp.java 部门java hibernate.cfg.xml Emp.hbm.xml 部门hbm。xml Test.java 我得到的例外是: 线程“main”组织中出现异常。冬眠HibernateException:无法分析配置:/hib

  • 问题内容: 我在两个表之间有多对多关系。 表包含我的餐厅。 表包含不同的类别。 表包含两列,每列分别包含两个表的ID。 以下陈述是我能想到的,但没有给我我想要的输出。 我希望输出是有关餐厅的信息,并在最后一列中是类别的连接行。 问题答案: 要串联值,可以使用。xml路径解决方案有误,应使用和特殊字符。 您也可以使用变量解决方案

  • 问题内容: 显式内部连接与隐式内部连接是否存在效率差异?例如: 与 问题答案: 在性能方面,它们是完全相同的(至少在SQL Server中)。 PS:请注意,自SQL Server 2005起不赞成使用该语法。(仍支持问题中使用的语法) 弃用“旧样式” JOIN语法:只是部分事情