SQL - 仅返回特定行匹配的位置

时间:2013-10-08 12:41:50

标签: sql

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

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个项目)并且表格可能非常大(可能达到数十亿行),因此效率非常重要。

有什么想法吗?

2 个答案:

答案 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上找到完整的示例。