【问题标题】:Converting complex SQL to JOIN将复杂的 SQL 转换为 JOIN
【发布时间】:2014-02-06 12:27:30
【问题描述】:

我有以下 SQL 语句。哪个工作正常。除了在某些情况下,查询的处理需要很长时间,导致系统超时。所以我需要转换语句。可能带有 JOIN。

我不知道如何转换这个语句:

SELECT table1.id as id, 
       table1.firstname, 
       table1.lastname, 
       table3.name, 
       table4.name 

FROM table1, table2, table3, table4, table5 

WHERE table1.id = table2.tabel1id 
AND table2.table2id = table3.table2id 
AND table3.table3id = table5.table3id
AND table5.somecode = '5' 
AND table3.table3id = table4.name 
AND table1.firstname LIKE '%John%' 

GROUP BY table1.id 
ORDER BY table3.name, table1.firstname, table1.lastname

我有表的嵌套,我还想在最终的 SELECT 中使用子查询的结果(table3.name 和 table4.name)

【问题讨论】:

    标签: mysql sql sql-server subquery inner-join


    【解决方案1】:

    您已经有 JOIN,但您使用隐式版本(FROM 中的逗号分隔表列表加上 WHERE 中的连接条件)而不是显式版本(JOIN 加上 ON)。

    所以重写不应该提高性能(否则 MySQL 比我想象的更糟糕)。

    您最好检查一下您是否创建了所有必要的索引。

    【讨论】:

    • 根据 SQL 文档,JOIN 和子查询之间存在差异(正如我在上面使用的那样)。基于 select 语句,使用另一个执行路径。所以恐怕你的结论是不正确的。
    • 您没有使用子查询。 subquery 是 WHERE 条件下的 SELECT,例如 WHERE col IN (SELECT col1 FROM ....),有时是 Derived Tables,即像 SELECT ... FROM (SELECT ...) AS dt 这样的 FROM 中的 SELECT 也称为子查询。
    【解决方案2】:
    SELECT table1.id as id, 
           table1.firstname, 
           table1.lastname, 
           table3.name, 
           table4.name 
    
    FROM table1 INNER JOIN table2
    ON table1.id = table2.tabel1id 
    INNER JOIN  table3 
    ON table2.table2id = table3.table2id
    INNER JOIN  table4
    ON table3.table3id = table4.name 
    INNER JOIN table5 
    ON table3.table3id = table5.table3id
    WHERE 
         table5.somecode = '5' 
    AND table1.firstname LIKE '%John%' 
    
    GROUP BY table1.id as id, 
           table1.firstname, 
           table1.lastname, 
           table3.name, 
           table4.name 
    ORDER BY table3.name, table1.firstname, table1.lastname
    

    Read Here 了解更多关于 sql server JOIN 语法的信息

    【讨论】:

    • select clause 中的所有列也必须存在于group by 中,否则使用distinct
    • @praveen 为什么有必要这样做?没有汇总,OP的问题也没有说明这一点。答案对我来说似乎是正确的。
    • @NickyvV:查询甚至无法在 sql server stackoverflow.com/questions/13999817/…中编译
    【解决方案3】:
    select t1.id,t1.firstname,t3.name,t4.name 
    from table1 as t1 
    inner join table2 as t2 on t1.id=t2.tabel1id 
    inner join on table3 as t3 on t2.table2id=t3.table2id
    inner join on table4 as t4 on t3.table3id=t4.name
    inner join on table5 as t5 on t5.table3id=table3.table3id 
    where t1.firstname like '%John%' and t5.somecode='5'
    group by t1.id
    order by t3.name,t1.firstname,t1.lastname
    

    【讨论】:

    • 所以基本上 JOIN 只是为了实现与表的关系,所有真正的依赖关系都列在 WHERE 中。但是这样一来所有的表都完全连接起来了,没有子查询?
    • join 可以更轻松地关联任意两个表。如果两个表之间有一个公共字段,则使用内部联接,否则始终可以使用外部联接。子查询,但据我所知,它会使整个查询复杂化。只要有任何方法可以在没有子查询的情况下触发查询,您应该使用它。
    猜你喜欢
    • 2020-09-29
    • 2015-10-18
    • 1970-01-01
    • 1970-01-01
    • 2016-09-13
    • 2020-01-15
    • 1970-01-01
    • 1970-01-01
    • 2018-07-31
    相关资源
    最近更新 更多