【发布时间】:2014-12-03 05:37:28
【问题描述】:
我正在学习 SQL,并且已经阅读了 GalaXQL 应用程序的各个章节。
我写了以下查询来回答“突出显示星系中轨道距离最长的行星的恒星(或恒星)。记得在开始之前清除旧的亮点。”
这个查询返回的结果是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));
我在这个查询结构背后的逻辑
首先找到距离表“行星”轨道距离最大的行星。
第二将“最高轨道距离”的值与“行星”表的“轨道距离”字段进行比较,并返回与该字段相关的“星轨”。
第三将“planets”表中“starid”字段的值与“stars”表中“starid”字段的值进行比较,然后将该“starid”插入表“高亮”。
数据结构:
【问题讨论】:
-
尝试将
SELECT DISTINCT s.starid FROM planets AS p, stars AS s, moons AS m WHERE...更改为:SELECT s.starid FROM stars AS s WHERE... -
问题 1 是您正在使用 ancient join syntax. 以及为什么要进行交叉连接?您不应该为这些连接设置
ON条件吗?如果你这样做了,你可能也不需要那种独特的东西。 -
@ypercube:这会导致“starid”的大量副本被传递给“hilight”。由于“hilight”表中的“starid”是一个唯一整数,这会导致错误“column starid is not unique”并且不允许我继续。但是,DISTINCT 似乎确实是个问题,在没有 DISTINCT 的情况下运行查询并且没有尝试将数据插入到 hilight 表中,运行成功且快速。
-
@Awebb 问题确实说“(或星号)”,所以我们预计会有多个结果。
-
@Awebb 你会得到很多值,因为你正在做一个
cross join。这让我回到了我原来的观点。你需要修复你的JOIN's!