SQL 语句的有效交集
Intersection of SQL statements efficiently
我正在尝试解决一个 SQL 问题,我需要 select 某个交叉点的数据。这或多或少是我的查询:
SELECT id FROM some_table WHERE
id IN (SELECT id FROM other_table WHERE _id=1 AND some_value >= 1 AND some_value <= 10) AND
id IN (SELECT id FROM another_table WHERE _id=2 AND some_other_value >= -65 AND some_other_value <= -2)
该查询的问题在于它没有 return 交集,因为 _id
字段与两个子查询不同。因此该查询将 return 始终为空结果。
如果我使用 OR
而不是 AND
来“交叉”子查询,那么交叉也不是 returned.
我也不想使用 INTERSECT
,因为那有点慢,而且这只是一个非常大的查询的简化示例,所以速度真的很重要。
所以,我的问题是,有什么办法可以尽快完成这个交集吗?请记住,即使在示例中只出现了两个子查询,但在我的实际用例中,子查询的数量可以更大。
我仍然不清楚您想要什么 w/o 示例数据预期结果:但是这些选项中的任何一个都有效吗?
内部联接...
SELECT id
FROM some_table A
INNER JOIN (SELECT id FROM other_table WHERE _id=1 AND some_value >= 1 AND some_value <= 10) B on A.ID = B.ID
INNER JOIN (SELECT id FROM another_table WHERE _id=2 AND some_other_value >= -65 AND some_other_value <= -2) C
on C.ID = A.ID
相交
SELECT id FROM some_table
INTERSECT
SELECT id FROM other_table WHERE _id=1 AND some_value >= 1 AND some_value <= 10
INTERSECT
SELECT id FROM another_table WHERE _id=2 AND some_other_value >= -65 AND some_other_value <= -2
然后我想我们可以使用 exists
和相关子查询而不是 IN
;这可以更快,因为它可以在没有 in 的地方提前逃脱。
我正在尝试解决一个 SQL 问题,我需要 select 某个交叉点的数据。这或多或少是我的查询:
SELECT id FROM some_table WHERE
id IN (SELECT id FROM other_table WHERE _id=1 AND some_value >= 1 AND some_value <= 10) AND
id IN (SELECT id FROM another_table WHERE _id=2 AND some_other_value >= -65 AND some_other_value <= -2)
该查询的问题在于它没有 return 交集,因为 _id
字段与两个子查询不同。因此该查询将 return 始终为空结果。
如果我使用 OR
而不是 AND
来“交叉”子查询,那么交叉也不是 returned.
我也不想使用 INTERSECT
,因为那有点慢,而且这只是一个非常大的查询的简化示例,所以速度真的很重要。
所以,我的问题是,有什么办法可以尽快完成这个交集吗?请记住,即使在示例中只出现了两个子查询,但在我的实际用例中,子查询的数量可以更大。
我仍然不清楚您想要什么 w/o 示例数据预期结果:但是这些选项中的任何一个都有效吗?
内部联接...
SELECT id
FROM some_table A
INNER JOIN (SELECT id FROM other_table WHERE _id=1 AND some_value >= 1 AND some_value <= 10) B on A.ID = B.ID
INNER JOIN (SELECT id FROM another_table WHERE _id=2 AND some_other_value >= -65 AND some_other_value <= -2) C
on C.ID = A.ID
相交
SELECT id FROM some_table
INTERSECT
SELECT id FROM other_table WHERE _id=1 AND some_value >= 1 AND some_value <= 10
INTERSECT
SELECT id FROM another_table WHERE _id=2 AND some_other_value >= -65 AND some_other_value <= -2
然后我想我们可以使用 exists
和相关子查询而不是 IN
;这可以更快,因为它可以在没有 in 的地方提前逃脱。