在练习编写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)是否有更好的选择?
答案 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 BY
和LIMIT
:
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;
在早期版本中,您需要重复子查询或使用变量。