-1

我有一个大表(数百万个条目),结构如下:

PASS_NUMBER
PASS_LOCATION

一个特定的 pass (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 个项目)并且表可能会变得非常大(可能达到数十亿行),因此效率很重要。

有什么想法吗?

4

2 回答 2

1

以下将起作用:

SELECT DISTINCT PASS_NUMBER
FROM PASS_TABLE
WHERE PASS_LOCATION IN (PASS_LOCATIONS)

其中 PASS_LOCATIONS 是以逗号分隔的位置列表。

如果您想确保性能正常,请考虑对 Pass_Location 列进行索引(可能在同一索引中后跟 pass_number,以便优化器可以进行单个索引查找) - 但这取决于很多事情,包括您所使用的特定数据库使用以及实际数据本身。对于现代 RDBMS 而言,数百万行确实不一定是“大量数据”,但当然这取决于您的具体实现和要求。

于 2013-10-08T12:46:25.980 回答
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上找到完整的示例。

于 2013-10-08T12:56:45.780 回答