Выберите Запрос по паре полей, используя предложение in

У меня есть таблица игроков под названием:

First_Id    Second_Id     Name
1           1             Durant
2           1             Kobe
1           2             Lebron
2           2             Dwight
1           3             Dirk

Я хочу написать оператор выбора в этой таблице, чтобы получить все строки, чьи первые и вторые идентификаторы соответствуют группе указанных первого и второго идентификаторов.

Так, например, я хочу выбрать все строки, чьи первый и второй идентификаторы следующие: (1,1), (1,2) и (1,3). Это позволит получить следующие 3 строки:

First_Id    Second_Id    Name
1           1            Durant
1           2            Lebron
1           3            Dirk

Можно ли написать запрос на выборку таким образом:

SELECT * 
FROM PLAYERS
WHERE (First_Id, Second_Id) IN ((1,1), (1,2) and (1,3))?

Если есть способ написать SQL, аналогичный приведенному выше, я хотел бы знать. Есть ли способ указать значения для предложения IN, которое представляет несколько строк, как показано на рисунке.

Я использую DB2.

7 ответов

Это работает на моем DB2 (версия 9.7 в Linux/Unix/Windows) с использованием этого синтаксиса:

SELECT *
FROM PLAYERS
WHERE (First_Id, Second_Id) IN (VALUES (1,1), (1,2), (1,3))

Этот синтаксис не будет работать в DB2 на мейнфрейме (по крайней мере, в версии 9.1), потому что вы не можете заменить подвыбор выражением VALUES. Этот синтаксис будет работать:

SELECT *
FROM PLAYERS
WHERE (First_Id, Second_Id) IN (SELECT 1, 1 FROM SYSIBM.SYSDUMMY1 UNION ALL
                                SELECT 1, 2 FROM SYSIBM.SYSDUMMY1 UNION ALL
                                SELECT 1, 3 FROM SYSIBM.SYSDUMMY1)

Вот очень похожее решение в postgresql:

SELECT tmp_table.val1, tmp_table.val2
FROM tmp_table
WHERE (tmp_table.val1, tmp_table.val2) not in (select tmp_table2.val1, tmp_table2.val2 from tmp_table2);

Этот синтаксис работает в MySQL:

      SELECT *
FROM PLAYERS
WHERE (First_Id, Second_Id) IN ((1,1), (1,2), (1,3))

С составными первичными ключами я бы связал два идентификатора и сопоставил составные строки.

select id1 + id2 as FullKey, *
from players
where FullKey in ('11','12','13')

(Если идентификаторы не являются строками, просто приведите их как таковые.)

SELECT * FROM <your table> where (<field1>, <field2>, ...) in (SELECT <field1>, <field2>, ... FROM <your table> where <your condition>)

Это сработало чудо для меня.

Если данные необходимы в следующем порядке:

тогда простым и легким способом будет:

выберите * из списка игроков по First_id, second_id;

Предложение «где» можно использовать, если какое-либо условие необходимо для любого из столбцов.

Этот тип запроса работает в DB2.

SELECT * FROM A
WHERE (C1, C2) IN (SELECT B1, B2 FROM B WHERE B3=1);
Другие вопросы по тегам