在这种情况下INNER JOIN或嵌套SELECT?

时间:2014-07-01 15:21:47

标签: sql sqlite join inner-join

我有两张桌子:

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):

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个记录。当我测量并且想要更快的解决方案时,这个查询花了很多时间。

我正在使用的查询(内部联接):

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查询,以便它不会给我额外的数据?

2 个答案:

答案 0 :(得分: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 );

答案 1 :(得分:1)

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

使用有意义的join子句,在这种情况下,我指的是t1.ID2 = t2.ID2子句。如果这是外键关系,则此子句确保返回的最大行数为MAX(t1,t2)。

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

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