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;
Другие вопросы по тегам