2010-12-15 3 views
15

Можно ли включить в поле IN несколько полей? Что-то вроде следующего:Предложение SQL Server - IN с несколькими полями

select * from user 
where code, userType in (select code, userType from userType) 

Я использую MS SQL Server 2008


Я знаю, что это может быть достигнуто с соединениями и существует, я просто хотел бы знать, если это только может быть сделано с пункт IN.

+4

Тот факт, что вы ожидаете * два * столбцы из одной таблицы, чтобы быть «в» вторая таблица указывает на схему, нуждающуюся в дальнейшей нормализации. – 2010-12-15 16:53:54

ответ

14

Не так, как вы разместили. Вы можете вернуть только одно поле или тип для работы IN.

Из MSDN (IN):

test_expression [ NOT ] IN 
    (subquery | expression [ ,...n ] 
    ) 

subquery - Is a subquery that has a result set of one column. 
      This column must have the same data type as test_expression. 

expression[ ,... n ] - Is a list of expressions to test for a match. 
         All expressions must be of the same type as 
         test_expression. 

Вместо IN, вы могли бы использовать JOIN с помощью двух полей:

SELECT U.* 
FROM user U 
    INNER JOIN userType UT 
    ON U.code = UT.code 
    AND U.userType = UT.userType 
+0

Yeap, я подозревал, что это не было возможно – opensas 2010-12-15 17:05:13

+0

http://social.msdn.microsoft.com/forums/en-US/transactsql/thread/4e058e95-9d7c-4baa-a73e-3c849b4c6463
удалить из test1 , где нет существует (выберите 0 из test2 где test1.col1 = test2.col1 и test1.col2 = test2.col2) – Vijay 2012-09-20 05:01:04

+0

@Vijay - Что вы пытаетесь сказать? – Oded 2012-09-20 08:33:54

0

Как об этом вместо:

SELECT user.* FROM user JOIN userType on user.code = userType.code AND user.userType = userType.userType 
9

Вы можете использовать такую ​​форму:

select * from user u 
where exists (select 1 from userType ut 
       where u.code = ut.code 
       and u.userType = ut.userType) 
+0

да, я обычно делаю так, просто пытаюсь избежать существования ... – opensas 2010-12-15 16:59:38

+1

Ну, вам, вероятно, придется использовать либо «СУЩЕСТВУЕТ», либо «ПРИСОЕДИНЯЙТЕСЬ», чтобы выполнить это. – cdhowie 2010-12-15 17:00:18

+0

да, cdhowie, вот что мой вопрос был о ... – opensas 2010-12-15 17:06:09

-2

Я не думаю, что запрос достаточно портативный, было бы безопаснее использовать что-то вроде

select * from user 
where code in (select code from userType) and userType in (select userType from userType) 
0

Вы можете использовать либо присоединяется

SELECT * FROM user U 
INNER JOIN userType UT on U.code = UT.code 
AND U.userType = UT.userType 
-3
select * from user 
where (code, userType) in (select code, userType from userType); 
4

Только с что-то ужасное, например

select * from user 
where (code + userType) in (select code + userType from userType) 

Затем вам нужно управлять нулями и конкатенациями чисел, а не добавлять их и выполнять кастинг, а код 12 и тип пользователя 3 - код 1 и тип пользователя из 23 и ...

Итак, ya go: решение, которое не использует объединения или существует .. и множество причин, почему вы не должны его использовать;)

0

Мне пришлось сделать что-то очень похожее, но EXISTS не работало в моей ситуации. Вот то, что работает для меня:

UPDATE tempFinalTbl 
SET BillStatus = 'Non-Compliant' 
WHERE ENTCustomerNo IN (SELECT DISTINCT CustNmbr 
      FROM tempDetailTbl dtl 
      WHERE dtl.[Billing Status] = 'NEEDS FURTHER REVIEW' 
       AND dtl.CustNmbr = ENTCustomerNo 
       AND dtl.[Service] = [Service]) 
    AND [Service] IN (SELECT DISTINCT [Service] 
      FROM tempDetailTbl dtl 
      WHERE dtl.[Billing Status] = 'NEEDS FURTHER REVIEW' 
       AND dtl.CustNmbr = ENTCustomerNo 
       AND dtl.[Service] = [Service]) 

EDIT: Теперь, когда я смотрю, это очень близко к @ v1v3kn отвечают

Смежные вопросы