【问题标题】:INNER JOIN or nested SELECT in this case?在这种情况下是 INNER JOIN 还是嵌套 SELECT?
【发布时间】:2014-07-01 15:21:46
【问题描述】:

我有两张桌子:

atvtrails_prim:

ID int PK
ID2 int
TType varchar(100)

atvtrails_sec:

ID2 int Foreign Key(Relates to ID2 of atvtrails_prim)
Latitude double
Longitude double

我想从这些表中得到什么:atvtrails_sec 中 ID2 在 atvtrails_prim 中具有特定 TType 的所有记录。

我正在使用的查询(嵌套选择):

SELECT atvtrails_sec.ID2,atvtrails_sec.Latitude, atvtrails_sec.Longitude,atvtrails_prim.TType 
FROM atvtrails_sec,atvtrails_prim 
WHERE atvtrails_sec.Latitude BETWEEN %@ and %@ 
AND atvtrails_sec.Longitude BETWEEN %@ and %@ 
AND (
    SELECT TType from atvtrails_prim where ID2=atvtrails_sec.ID2
    ) =%@", lrLat, ulLat, lrLong, ulLong,type2

lrLat、ulLat、lrLong、ulLong、type2 是变量。我正在使用 Objective-c 进行编码。

这个查询给了我一个非常大的数据集。它确实给了我正确的,但它们被复制了。我得到大约 90000 个结果,而表只有 18000 条记录。这个查询在我测量时需要很长时间,我想要一个更快的解决方案。

我正在使用的查询(INNER JOIN):

SELECT atvtrails_sec.ID2,atvtrails_sec.Latitude, atvtrails_sec.Longitude 
FROM atvtrails_sec 
INNER JOIN atvtrails_prim ON atvtrails_prim.TType=%@ 
WHERE atvtrails_sec.Latitude BETWEEN %@ and %@ 
AND atvtrails_sec.Longitude BETWEEN %@ and %@", lrLat, ulLat, lrLong, ulLong,type1

这不会返回任何数据。我是 SQLite 的新手。请指导我如何使用 Inner-Join 获得所需的数据。另外,有什么方法可以优化我的嵌套 SELECT 查询,使其不会给我额外的数据?

【问题讨论】:

  • 您可以突出显示问题中的代码段并单击{} 图标以保留代码格式。还要尝试以可读的方式格式化代码。最后,你用的是mysql还是sqlite?删除不正确的标签。
  • 在解析查询时遇到问题,但看起来您实际上从未在第二个查询中将表连接在一起。那里有很多教程,这里有一个:Clicky
  • 我在这里使用 SQLite。

标签: sql sqlite join inner-join


【解决方案1】:

这样的东西有用吗?:

SELECT prim.ID,sec.*
FROM atvtrails_prim prim
LEFT JOIN atvtrails_sec sec ON sec.ID2 = prim.ID2
WHERE prim.TType = 'dirt';

此外,您可能希望索引 atvtrails_prim.TType 列以获得更好的查询性能:

ALTER TABLE atvtrails_prim ADD KEY TType (TType );

【讨论】:

    【解决方案2】:

    结果变得臃肿,因为您忘记应用有意义的连接子句。没有子句的两个表的联接称为笛卡尔联接,将返回 t1 * t2 行,其中 t1 是 table1 中的行数,t2 是 t2 中的行数。

    对于有意义的连接子句,在这种情况下,我的意思是t1.ID2 = t2.ID2 子句。如果这是外键关系,则该子句确保返回的最大行数为 MAX(t1,t2)。

    所以像这样开始你的查询,然后从那里开始:

    SELECT * FROM t1
    INNER JOIN t2 ON t1.ID2 = t2.ID2
    (...)
    

    【讨论】:

    • "没有子句的两个表的联接称为笛卡尔联接,将返回 t1 * t2 行,其中 t1 是 table1 中的行数,t2 是 t2 中的行数。" +1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-28
    • 2010-12-17
    • 2011-06-06
    • 2012-03-01
    • 1970-01-01
    相关资源
    最近更新 更多