T-SQL эквивалентно Oracle SQL, где предложение с несколькими столбцами
Давайте посмотрим на пример Oracle SQL, который отлично работает:
Пример данных:
SQL> create table test (a number, b number);
SQL> insert into test values(1, 1);
SQL> insert into test values(1, 2);
SQL> insert into test values(1, 3);
SQL> insert into test values(1, 4);
SQL> insert into test values(1, 5);
SQL> insert into test values(2, 1);
SQL> insert into test values(2, 2);
SQL> insert into test values(2, 3);
SQL> insert into test values(2, 4);
SQL> insert into test values(2, 5);
SQL> insert into test values(4, 1);
SQL> select * from test;
A B
---------- ----------
1 1
1 2
1 3
1 4
1 5
2 1
2 2
2 3
2 4
2 5
4 1
Запрос:
SQL> select * from test where (a, b) in (select 1, 4 from dual);
A B
---------- ----------
1 4
Вот sql-скрипка: http://www.sqlfiddle.com/
Простой вопрос: есть ли в MS SQL какой-либо эквивалент вышеприведенного предложения "where (a, b)"? Я искал в Google, MS Docs и ничего до сих пор...
2 ответа
В то время как SQL Server имеет Table Value Constructor
который может использоваться для некоторых случаев использования, SQL Server не поддерживает стандартные выражения значения строки SQL и предикаты, полученные из выражений значения строки для общего использования (пока). Вам придется прибегнуть к полусоединению вашего подзапроса, используя эквивалентный EXISTS
пункт:
Это:
select * from test where (a, b) in (select 1, 4 from dual);
Это эквивалентно этому (см. Демонстрацию SQLFiddle):
select * from test where exists (
select * from (
select 1, 4 -- Replace with "real" subselect
) t(a, b)
where test.a = t.a and test.b = t.b
)
Или, немного более обобщенно, используя общее табличное выражение (см. Демонстрацию SQLFiddle):
with t(a, b) as (
select 1, 4 -- Replace with "real" subselect
)
select * from test where exists (
select * from t
where test.a = t.a and test.b = t.b
)
Как насчет запроса ниже, который поддерживает в SQL Server; и я думаю a=1 and b=4
дает тот же результат в SQL Server, эквивалентный оракулу запроса.:
select
*
from
test
where
a=1 and
b=4;