我正在学习SQL,并且一直在经历GalaXQL应用程序的章节。SELECT .. FROM(SELECT .. FROM ..)。我该如何改进这个查询?
我已经写了下面的问题来回答这个问题:“Hilight拥有星系中最高轨道距离的星球,记得在开始之前清除旧的山丘。
该查询返回结果starid:23334,当插入到hilight表中时,该结果允许我继续。然而,在将这个结果交还给我之前,该程序长时间停滞,所以我怀疑从数据库中提取这些信息的方法更为有效。
该查询有效,但需要很长时间才能处理,我该如何改进此查询?
INSERT INTO hilight
SELECT DISTINCT s.starid
FROM planets AS p, stars AS s, moons AS m
WHERE s.starid=(SELECT starid
FROM planets
WHERE orbitdistance=(SELECT MAX(orbitdistance)
FROM planets));
我这个查询结构
首先背后的逻辑找到从表“行星”最大的轨道距离地球。
第二将“最高轨道距离”的值与表“行星”的“轨道距离”字段进行比较,并返回与该字段有关的“星号”。
第三将表格“行星”中的字段“starid”的值与表格“星星”中的字段“starid”进行比较,然后将该“starid”插入到表格“hilight”中。
数据结构:
尝试更改'SELECT DISTINCT s.starid从行星AS p,星星AS s,卫星AS m WHERE ...'到:'SELECT s.starid FROM stars AS s WHERE ...' – 2014-10-08 14:11:37
问题1是你正在使用[古代加入语法。](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins.aspx)也是为什么你在做一个交叉连接吗?你不应该为这些连接设置“ON”状态吗?如果你这样做了,你可能也不需要那么明显。 – Zane 2014-10-08 14:13:41
@ypercube:这会导致大量的“starid”被传递给“hilight”。由于“hilight”表中的“starid”是一个唯一的整数,这会导致错误“column starid不是唯一的”,并且不允许我进步。 但是,DISTINCT似乎是问题,在没有DISTINCT的情况下运行查询并且没有尝试将数据插入到hilight表中可以成功快速地运行。 – Awebb 2014-10-08 14:18:06