Есть ли реализация этого синтаксиса запроса в TSQL? - PullRequest
2 голосов
/ 05 июня 2009

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

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

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

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

ОБНОВЛЕНИЕ: это допустимый синтаксис SQL-99, поэтому я считаю объединение обходным путем, даже если оно будет более производительным. Мой вопрос может быть лучше сформулирован как:

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

ОБНОВЛЕНИЕ 2: Я только что проверил этот синтаксис om Mysql, и он прекрасно работает там.

Ответы [ 5 ]

10 голосов
/ 05 июня 2009
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.

4 голосов
/ 05 июня 2009

Нет реализации сервера 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
1 голос
/ 05 июня 2009

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

0 голосов
/ 05 июня 2009
Select SomeTable.*
FROM SomeTable, SomeOtherTable
WHERE SomeTable.Val1 = SomeOtherTable.Val1
    And SomeTable.Val2 = SoemeOtherTable.Val2

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

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

0 голосов
/ 05 июня 2009

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, которое зависит от каждой строки (например, -WERE SomeOtherTable.ID = SomeTable.MyOtherID), оно будет влиять на производительность, и объединение - абсолютно верный путь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...