再次从内部查询中选择

时间:2019-05-05 14:17:51

标签: mysql sql

在练习编写SQL查询时,我注意到我无法以类似于以下形式的形式执行查询:

(1)

SELECT attr1, attr2 FROM
   (SELECT attr1, attr2 FROM ...) AS table     
WHERE attr1 >= ALL
   (SELECT attr1 FROM table)

(1)中的想法是我从一个别名为“ table”的内部查询中进行选择。我还想添加一个WHERE子句以应用比较并获得所需的查询结果。因此,我将属性与“表”中的属性进行比较。

在这种情况下,我将选择所有在内部查询结果中获得最大值的attr1,这些别名被分配了别名“ tables”。

但是上面的示例不起作用,并且出现错误。

我意识到,如果执行以下操作,我将获得查询结果:

(2)

SELECT attr1, attr2 FROM
   (SELECT attr1, attr2 FROM ...) AS alias1   
WHERE attr1 >= ALL
   (SELECT attr1 FROM ...)

其中两个内部查询相同,除了第二个查询中不存在attr2之外。

关于查询(2)的唯一问题是,如果内部查询很长,则实际上是在复制并粘贴一大堆代码,以便在WHERE子句下再次使用。

我的问题是为什么查询(1)无效,以及查询(2)是否有更好的选择?

2 个答案:

答案 0 :(得分:0)

查询1无效,因为SELECT子句和列使用FROM和WHERE子句之后执行的子查询a进行动态构建

因此在执行select时该表不可用。

第二个字符对于其中where列中存在别名的别名无效

   SELECT attr1, attr2 
FROM
   (SELECT attr1, attr2 FROM ...) AS alias1   
WHERE attr1 >= ALL
   (SELECT attr1 FROM ...) 

有效,因为子查询select子句中没有别名

但是查看代码时,您应该评估是否选择suqbery,以及可以将查询重构为联合查询的条件

SELECT attr1, attr2 
FROM your_table 
(
  SELECT attr1, attr2 
  FROM your_table 
  WHERE  .... ) AS alias1   
WHERE alias1.attr1   >= your_table.att1

答案 1 :(得分:0)

如果只需要一行,则可以使用ORDER BYLIMIT

SELECT attr1, attr2
FROM (SELECT attr1, attr2 FROM ...) t
ORDER BY attr1 DESC
LIMIT 1;

如果您使用的是MySQL 8+,则可以使用RANK()获取重复项:

SELECT attr1, attr2
FROM (SELECT attr1, attr2,
             RANK() OVER (ORDER BY attr1 DESC) as seqnum
      FROM ...
     ) t
WHERE seqnum = 1;

在早期版本中,您需要重复子查询或使用变量。