Как выполнить SELECT для таблицы со списком составных ключей? - PullRequest
2 голосов
/ 23 октября 2011

Если у меня есть таблица с такими столбцами, как

ID1 ID2 VAL1 VAL2

Где ID1, ID2 создает индекс первичного ключа.

Каквыполнить какие-либо операторы SQL для определенных значений ID1, ID2?

Пример: у меня есть таблица с записями, которая имеет 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, ГДЕ ID1 IN (1,3) И ID2 IN (1,2,5)

приведет к нежелательному результатурезультат: (3,1).Итак, каков наилучший способ сделать это?

Я ищу общий ответ для SQL, но если он зависит от СУБД, я хотел бы знать, как это сделать в PostgreSQL и MySQL.

Ответы [ 5 ]

1 голос
/ 23 октября 2011

MySQL и PostgreSQL поддерживают кортежи в IN, как показано ниже.

SELECT * 
FROM tbl1
WHERE (ID1,ID2) IN ((1,1) (1,2) (2,4) (2,1) (3,1) (3,2) (3,5));
0 голосов
/ 23 октября 2011

Вы также можете попробовать

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

0 голосов
/ 23 октября 2011
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)) 
0 голосов
/ 23 октября 2011

Это, пожалуй, самый компактный способ сделать то, что вы просили:

SELECT *
FROM tbl1
WHERE (ID1 = 1 AND (ID2 = 1 OR ID2 = 2))
   OR (ID1 = 3 AND (ID2 = 5 OR ID2 = 2));
0 голосов
/ 23 октября 2011

Вы можете сделать это с and и or:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...