内部联接使用相同的表返回内存不足

时间:2013-05-27 07:42:40

标签: database sqlite inner-join

我有一张像

这样的表格
+----+----------+----------+---------+
| ID | ParentID | IsSource |  Value  |
+----+----------+----------+---------+
|  1 |        1 |        1 | Car     |
|  2 |        1 |        0 | Coche   |
|  3 |        2 |        1 | Car     |
|  4 |        2 |        0 | Auto    |
|  5 |        3 |        1 | House   |
|  6 |        3 |        0 | Hogar   |
|  7 |        4 |        1 | Bus     |
|  8 |        4 |        0 | Autobus |
+----+----------+----------+---------+

但有160万条目

我喜欢获取包含相同值但不同ID(或ParentID)的条目,并且仅用于包含“IsSource = 1”的条目 为此,我正在使用具有相同表的INNER JOIN语句

SELECT seg1.ParentID , seg2.ParentID FROM tblSegment seg1
INNER JOIN tblSegment seg2 ON
seg1.Value  = seg2.Value  AND
seg1.ID!= seg2.ID
WHERE seg1.isSource = 1 and seg2.isSource = 1

虽然我已经为所有字段编制索引但是我得到了内存不足的错误 我使用了上面查询的许多变体,结果相同

有没有其他方法可以在合理的时间内获得预期的结果?

2 个答案:

答案 0 :(得分:0)

对于您的SQLite数据库来说,这似乎太多了。

你可以试试creating a VIEW也许这样可行。否则,您可能应该更改数据库模型,以便不需要该连接。

答案 1 :(得分:0)

对于数据库来说,GROUP BY可能更容易处理,虽然选择一个ID不同的ParentID会有点奇怪,你的样本查询会是这样的;

SELECT MIN(ParentID) p1, MAX(ParentID) p2
FROM tblSegment
WHERE IsSource=1
GROUP BY Value
HAVING COUNT(ID)>1

如果您想找到ParentID不同的地方,请使用;

SELECT MIN(ParentID) p1, MAX(ParentID) p2
FROM tblSegment
WHERE IsSource=1
GROUP BY Value
HAVING COUNT(DISTINCT ParentID)>1