T-SQL: где xxx IN во временной таблице

У меня есть временная таблица, и я хочу проверить в предложении where, содержится ли определенный идентификатор/строка во временной таблице.

Select...
WHERE MyId  IN MyTempTable

Я получаю общую ошибку в студии MS SQL Management.

оператор «In» не подходит для временных таблиц?


person Elisabeth    schedule 06.12.2010    source источник


Ответы (3)


Ваш синтаксис неверен:

SELECT ...
  FROM MyTable
 WHERE MyID IN (SELECT MyID
                  FROM MyTempTable)

Мне не очень нравится оператор IN, поэтому я предпочитаю это:

SELECT ...
  FROM MyTable
 WHERE EXISTS (SELECT *
                 FROM MyTempTable
                WHERE MyTable.MyID = MyID)

Но это во многом дело вкуса.

person Marcelo Cantos    schedule 06.12.2010
comment
+1 вы правы, потому что, как правило, лучше НЕ ВНУТРИ, а НЕ СУЩЕСТВУЕТ, которые совершенно разные. Так почему бы не использовать EXISTS последовательно? INTERSECT тоже работает. См. мой ответьте здесь пожалуйста - person gbn; 06.12.2010
comment
@gbn: Как я уже сказал, это в значительной степени вопрос вкуса, но мои причины больше основаны на моем понимании реляционной модели, чем просто на согласованности. Во-первых, IN — это бородавка в языке, которая совершенно не нужна; все, что может быть выражено с помощью (NOT) IN, имеет эквивалент (NOT) EXISTS. Но также это семантическая странность, которая не исходит ни из реляционной алгебры, ни из реляционного исчисления. Он был заложен туда разработчиками SQL по причинам, которые я не могу понять. Однако это должно было иметь большое значение, поскольку, по-видимому, это причина S в SQL (структурированный). - person Marcelo Cantos; 07.12.2010
comment
NOT IN не равно NOT EXISTS, отсюда и мой комментарий. NULL в списке NOT IN не даст никаких результатов. Почему там ИН? Я думаю, когда ANSI был составлен, они взяли IN из одного из тогдашних диалектов SQL. - person gbn; 07.12.2010
comment
@gbn: Вы правы, но я избегаю нулей, как чумы (зверства, такие как NOT IN ('a', 'b', 'c', NULL), являются лишь одним из многих мотивов), поэтому я обычно не рассматриваю такие сценарии в своем мышлении. Кроме того, я имел в виду не ANSI SQL, а оригинальную разработку, породившую эти диалекты. - person Marcelo Cantos; 07.12.2010
comment
@Lisa: Очевидный способ. Если вы не можете понять это, опубликуйте еще один вопрос с любым кодом, который вы пробовали. - person Marcelo Cantos; 07.12.2010

Ваш синтаксис немного неверен. Вам нужно сделать:

SELECT ...
  FROM ...
 WHERE MyId IN (SELECT MyId 
                  FROM MyTempTable);
person Neil Knight    schedule 06.12.2010

in требуется список конкретных элементов. Таблицы обычно имеют более одного поля, как узнать, какое поле вы имеете в виду?

Вы можете использовать подзапрос, where field in (select whatever from #temp)

person Donnie    schedule 06.12.2010