因此,我一直在尝试提高此代码的复杂性。我搜索了很多SO问题,但我认为这不是我想要的。我想获得10个最长和最短的预期寿命国家-这就是UNION的宗旨。如您所见,有两个相同的子查询。
(SELECT *
FROM
(SELECT name, life_expectancy
FROM country_info
WHERE life_expectancy!="null") AS life_expectancy_table
ORDER BY life_expectancy DESC
LIMIT 10)
UNION
(SELECT *
FROM
(SELECT name, life_expectancy
FROM country_info
WHERE life_expectancy!="null") AS life_expectancy_table
ORDER BY life_expectancy
LIMIT 10)
我怀疑子查询正在运行2次,这是我要避免的事情。而且,即使查询没有运行两次,我也想使用别名来提高可读性。
答案 0 :(得分:0)
您的查询是一种很好的方法,但不需要那么多子查询:
(SELECT name, life_expectancy
FROM country_info
WHERE life_expectancy <> 'null'
ORDER BY life_expectancy DESC
LIMIT 10
) UNION -- intentional to remove duplicates
(SELECT name, life_expectancy
FROM country_info
WHERE life_expectancy <> 'null'
ORDER BY life_expectancy
LIMIT 10
);
life_expectancy
将存储为字符串似乎很奇怪。您可能打算life_expectancy IS NOT NULL
。
您还可以使用窗口功能执行此操作:
SELECT name, life_expectancy
FROM (SELECT ci.*,
ROW_NUMBER() OVER (ORDER BY life_expectancy DESC) as seqnum_desc,
ROW_NUMBER() OVER (ORDER BY life_expectancy ASC) as seqnum_asc
FROM country_info ci
WHERE life_expectancy <> 'null'
) t
WHERE seqnum_desc <= 10 OR seqnum_asc <= 10;