我有两张桌子:
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查询,以便它不会给我额外的数据?
答案 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
(...)