在子查询中引用查询结果别名

时间:2018-03-08 15:51:50

标签: mysql sql join

这主要是SQL语法/ SQL功能问题。为什么以下查询不起作用:

SELECT * from 
(
    select m.*, p.type,
    from multipliers m
    inner join pushes p
    on m.push_id = p.id
    where p.type = 'CONSTANT'
) AS res1 where res1.push_id = ( 
    select max(push_id) from res1
);

以下内容完成时没有问题:

SELECT * from 
(
    select m.*, p.type,
    from multipliers m
    inner join pushes p
    on m.push_id = p.id
    where p.type = 'CONSTANT'
) AS res1 where res1.push_id = ( 
    select max(push_id) from    
        (
            select m.push_id
            from multipliers m
            inner join pushes p
            on m.push_id = p.id
            where p.type = 'CONSTANT'
        ) AS res2
);

3 个答案:

答案 0 :(得分:0)

第一个查询无效,因为所选列不存在。至少如果你想重复使用它,它应该是res.push_id,无论如何,使用CTE会更好,正如Jarlh在评论中所说的那样。

WITH
 myCte AS (  select m.*, p.type,
           from multipliers m
          inner join pushes p
         on m.push_id = p.id
         where p.type = 'CONSTANT')
 SELECT * FROM myCte
 WHERE myCte.push_id = (SELECT MAX(push_id) FROM myCte)

答案 1 :(得分:0)

Per the MySQL 5.7 documentation

  

派生表不能是相关子查询,也不能包含外部引用或对同一SELECT的其他表的引用。

换句话说,您无法在子查询中引用派生表。文档没有说明这一点,但由于OOO问题,它可能以这种方式起作用,因为派生表不必在子查询之前处理。在MySQL 8.0中,您将能够使用Common Table Expression or CTE,它基本上允许您在查询之前定义可重用的派生表,但在此之前使用您的第二种方法。

答案 2 :(得分:0)

第一个查询中的错误是表别名(相关名称)不能用作FROM中的表表达式。

带有点和列的表别名标识表的列。 (在谓词逻辑或关系演算中,表别名是子行值变量。)