Есть ли реализация этого синтаксиса запроса в TSQL?

В некоторых диалектах SQL вы можете указать (что-то вроде):

SELECT * FROM SomeTable WHERE (val1,val2) IN (SELECT val1,val2 FROM SomeOtherTable) 

Но я не знаю, как это сделать в TSQL (sql server 2k), который я использую.

Я знаю (и использую на данный момент) обходные пути, такие как использование объединений или конкатенированных значений, но есть ли какой-то синтаксис в TSQL, я не замечаю этого?

UPDATE: это действительный синтаксис SQL-99, поэтому я считаю, что соединение обходное решение, даже если оно будет более эффективным. Мой вопрос может быть поставлен лучше:

Есть ли реализация этого синтаксиса в TSQL?

UPDATE2: Я просто проверил этот синтаксис om Mysql, и он отлично работает.

 SELECT * FROM SomeTable st WHERE EXISTS ( SELECT 1 FROM SomeOtherTable sot WHERE sot.val1 = st.val1 AND sot.val2 = st.val2 ) 

На самом деле это то, что оптимизирована конструкция IN с любым методом SEMI JOIN .

Что касается вашего вопроса,

Есть ли реализация этого синтаксиса в T-SQL ?

ответ нет

Как говорится в документации :

subquery который имеет результирующий набор из одного столбца. Этот столбец должен иметь тот же тип данных, что и test_expression .

В этом синтаксисе нет реализации sql-сервера. Вам нужно будет сделать что-то вроде этого:

 SELECT st.* FROM SomeTable st INNER JOIN ( SELECT val1, val2 FROM SomeOtherTable GROUP BY val1, val2 ) sot ON sot.val1= st.val1 AND sot.val2 = st.val2 

Присоединение было бы способом пойти сюда.

IN работает только с массивами с одиночными столбцами. Поскольку вы явно заявили, что хотите сделать предложение IN:

 SELECT * FROM SomeTable WHERE val1 IN (SELECT val1 FROM SomeOtherTable WHERE val2 = SomeTable.val2) AND val2 IN (SELECT val2 FROM SomeOtherTable WHERE val1 = SomeTable.val1) 

Ознакомьтесь с документацией . Поскольку существует предложение where, которое зависело от каждой строки (например, WHERE SomeOtherTable.ID = SomeTable.MyOtherID), он будет работать с производительностью, и соединение является абсолютно подходящим способом.

 Select SomeTable.* FROM SomeTable, SomeOtherTable WHERE SomeTable.Val1 = SomeOtherTable.Val1 And SomeTable.Val2 = SoemeOtherTable.Val2 

Вы не должны считать это «обходным путем». Это самый простой и стандартный способ выполнить то, что вы хотите выполнить.

Изменить: Возможно, это не ваш стандартный синтаксис JOIN, но это привычка.

  • В чем разница между подзапросом из и запроса перед выбором в TSQL?
  • T-SQL: одни и те же поля с использованием нескольких соединений
  • Подзапросы / присоединение к одной таблице
  • Перепишите этот INSERT * без * подзапроса, пожалуйста?
  • Заменить подзапрос с помощью JOIN / APPLY
  • Некорректный подзапрос SQL Server очень медленный
  • Выбор сервера Sql с регулярным выражением
  • Присоединение SQL-сервера к вопросу о производительности подзапроса
  • Подзапрос в отчетах ISNULL, IIF, CASE
  • Sql: Выберите счетчик (*) из (выберите ...)
  • Можно ли использовать хранимую процедуру в качестве подзапроса в SQL Server 2008?
  • Давайте будем гением компьютера.