嵌套语句和CTE的查询设计

时间:2012-10-26 23:27:25

标签: sql nested common-table-expression

我有一个查询,它从原始数据源顺序连接6个表。嵌套,这是一团糟:

SELECT
FROM
(
    SELECT
    FROM
    (
        SELECT
        FROM
        (. . .)
        INNER JOIN
    )
    INNER JOIN
)

我切换到CTE定义,每个定义都是前一个定义的一个连接,最后的查询提供了结果:

WITH
Table1 (field1, field2) AS
(
    SELECT
    FROM 
    INNER JOIN
),

Table2 (field2, field3) AS
(
    SELECT
    FROM Table1
    INNER JOIN
), . . . 

SELECT 
FROM Table 6

这更具可读性,依赖性按逻辑顺序向下流动。但是,这似乎不是CTE的预期用途(也是我不使用Views的原因),因为每个定义实际上只按顺序引用一次。

是否有关于如何构造顺序嵌套连接的指导,这些连接在结构上既可读又符合逻辑?

3 个答案:

答案 0 :(得分:1)

我认为利用CTE创建临时视图没有任何问题。

  1. 在一个较大的商店中,有一些角色被定义为分隔 DBA与开发人员的责任。一般而言,CREATE声明将成为这个官僚机构的受害者。因此,没有观点。 CTE非常好 折衷。
  2. 如果视图不是真的可以重复使用,那么使用SQL保持它可以使它更具可读性。
  3. CTE比子查询更具可读性和直观性(即使使用 只有一个级别)。如果您的子查询不相关,我建议 将所有子查询转换为CTE。
  4. 递归是CTE的“杀手级”应用程序,但并不意味着您不应该使用CTE,否则。
  5. 我能想到的唯一一点是(取决于你的数据库引擎)它可能会混淆或阻止优化器做它想做的事情。优化器非常智能,可以为您重写子查询。

    现在,让我们讨论滥用CTE,请注意不要将应用程序开发人员的知识替换为数据库引擎优化。有很多聪明的开发人员(我们更聪明)设计了这个软件,只是尽可能地编写没有cte或子查询的查询,让数据库完成工作。例如,在进行连接之前,我经常看到开发人员在子查询中的每个键都有DISTINCT / WHERE。你可能认为你做的是正确的事,但事实并非如此。

    关于你的问题,大多数人打算解决问题而不讨论理论问题。因此,你会让人们对你所追求的东西摸不着头脑。我不会说你在文中没有暗示,但也许更有力。

答案 1 :(得分:0)

可能是我不明白这个问题,但有什么问题:

select * from table1 t1, table2 t2, table3 t3, table4 t4, table5 t5, table6 t6 
where t1.id = t2.id and t2.id = t3.id and  t3.id = t4.id 
  and t4.id = t5.id and t5.id = t6.id

或使用table 1 t1 INNER JOIN table2 t2 ON t1.id = t2.id ....

答案 2 :(得分:0)

为什么你不加入这样的表格

select *
from Table1 as t1
    inner join Table2 as t2 on t2.<column> = t1.<column>
    inner join Table3 as t3 on t3.<column> = t2.<column>
    inner join Table4 as t4 on t4.<column> = t3.<column>
    inner join Table5 as t5 on t5.<column> = t4.<column>
    inner join Table6 as t6 on t6.<column> = t5.<column>