Выберите Запрос по паре полей, используя предложение 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);