我有一张大表(数百万条目),结构如下:
PASS_NUMBER
PASS_LOCATION
特定传递(PASS_NUMBER)可以包含任意数量的行。例如:
PASS_NUMBER PASS_LOCATION
1 A
1 B
1 D
2 A
2 B
2 E
3 A
3 D
3 E
我需要一个SQL查询,为每个PASS_LOCATIONS中所有位置有效的传递返回PASS_NUMBER。例如:
PASS_LOCATIONS {A,B} should produce PASS_NUMBERS {1,2}
PASS_LOCATIONS {A,D} should produce PASS_NUMBERS {1,3}
PASS_LOCATIONS {E} should produce PASS_NUMBERS {2,3}
PASS_LOCATIONS集合可能非常大(最多50个项目)并且表格可能非常大(可能达到数十亿行),因此效率非常重要。
有什么想法吗?
答案 0 :(得分:1)
以下内容可行:
SELECT DISTINCT PASS_NUMBER
FROM PASS_TABLE
WHERE PASS_LOCATION IN (PASS_LOCATIONS)
PASS_LOCATIONS是以逗号分隔的位置列表。
如果你想确保性能正常,可以考虑索引Pass_Location列(可能在同一个索引中跟着pass_number,以便优化器可以进行单个索引查找) - 但这取决于很多东西,包括特定的数据库你正在使用和实际的数据本身。数百万行实际上不一定是现代RDBMS的“大量数据”,但当然这取决于您的具体实现和要求。
答案 1 :(得分:0)
您可以使用半联接(WHERE EXISTS
)执行此操作:
SELECT
p1.PASS_NUMBER
FROM
PASS p1
WHERE
p1.PASS_LOCATION = 'A'
AND EXISTS
(SELECT
*
FROM
PASS p2
WHERE
p1.PASS_NUMBER=p2.PASS_NUMBER
AND p2.PASS_LOCATION='B')
;
您可以在SQL-Fiddle上找到完整的示例。