SQL连接格式 – 嵌套内连接

前端之家收集整理的这篇文章主要介绍了SQL连接格式 – 嵌套内连接前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在重构的旧系统中有以下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

它正在生成大量的记录并杀死系统,但有人可以解释语法吗?这可以用其他方式表达吗?

> Table1包含419行
> Table2包含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.然后,对于table3和Table2之间的每个匹配都将具有相同的影响… Y * Z …所以您的结果只有一个可能的ID在表1中可以有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

猜你在找的MsSQL相关文章