如何在具有复合键列表的表上执行SELECT?

时间:2011-10-23 09:48:03

标签: mysql sql postgresql

如果我有一个包含

列的表格
  

ID1 ID2 VAL1 VAL2

ID1,ID2作为主键索引。

如何为特定的ID1,ID2值执行任何SQL语句?

示例:我的记录表有PK(1,1)(1,2)(2,4)(2,1)(3,1)(3,2)(3,5)

我想只选择带(1,1)(1,2)(3,5)(3,2)

的记录

的SELECT查询
  

SELECT * FROM tbl1 WHERE ID1 IN(1,3)AND ID2 IN(1,2,5)

将产生不希望的结果:(3,1)。那么最好的方法是什么?

我正在寻找SQL的总体答案,但如果它依赖于DBMS,我想知道如何在PostgreSQL和MySQL中这样做。

5 个答案:

答案 0 :(得分:1)

MySQL和PostgreSQL都支持IN中的元组,如下所示。

SELECT * 
FROM tbl1
WHERE (ID1,ID2) IN ((1,1) (1,2) (2,4) (2,1) (3,1) (3,2) (3,5));

答案 1 :(得分:0)

您可以使用andor

执行此操作
SELECT  * 
FROM    tbl1
WHERE   ID1 = 1 AND ID2 = 1 OR
        ID1 = 1 AND ID2 = 2 OR
        ID1 = 3 AND ID2 = 5 OR
        ID1 = 2 AND ID2 = 2

答案 2 :(得分:0)

这可能是您所要求的最紧凑的方式:

SELECT *
FROM tbl1
WHERE (ID1 = 1 AND (ID2 = 1 OR ID2 = 2))
   OR (ID1 = 3 AND (ID2 = 5 OR ID2 = 2));

答案 3 :(得分:0)

SELECT * FROM tbl1 WHERE ID1 = 1 AND ID2 IN (1,2)
UNION
SELECT * FROM tbl1 WHERE ID1 = 3 AND ID2 IN (5,2) 

OR

SELECT * FROM tbl1 WHERE (ID1 = 1 AND ID2 IN (1,2)) OR (ID1 = 3 AND ID2 IN (5,2)) 

答案 4 :(得分:0)

您也可以尝试

SELECT
   *
FROM
  tbl1
  JOIN
  (
    SELECT 1 AS ID1, 1 AS ID2
    UNION ALL
    SELECT 1 AS ID1, 2 AS ID2
    UNION ALL
    SELECT 2 AS ID1, 4 AS ID2
    UNION ALL
    SELECT 2 AS ID1, 1 AS ID2
    UNION ALL
    SELECT 3 AS ID1, 1 AS ID2
    UNION ALL
    SELECT 3 AS ID1, 2 AS ID2
    UNION ALL
    SELECT 3 AS ID1, 5 AS ID2
  ) as keylist ON tbl1.ID1 = keylist.ID1 AND tbl1.ID2 = keylist.ID2