web-dev-qa-db-ja.com

SQL Server-複数のフィールドを持つIN句

IN句に複数のフィールドを含めることはできますか?次のようなもの:

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

私はMS SQL Server 2008を使用しています


これは結合で実現でき、存在することを知っています。IN句で実行できるかどうかを知りたかっただけです。

18
opensas

あなたが投稿した方法ではありません。 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の代わりに、2つのフィールドを使用してJOINを使用できます。

SELECT U.* 
FROM user U
  INNER JOIN userType UT
    ON U.code = UT.code
    AND U.userType = UT.userType
15
Oded

次のようなフォームを使用できます。

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

恐ろしいものだけで

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

次に、nullを追加してキャストするのではなく、nullと連結番号を管理し、コード12とユーザータイプ3とコード1とユーザータイプ23を比較する必要があります。

だから行くよ:結合を使用しない、または存在しないソリューション、そしてそれを使用してはいけない理由がたくさんあります;)

4
Caius Jard

結合を使用できます

SELECT * FROM user U 
INNER JOIN userType UT on U.code = UT.code 
AND U.userType = UT.userType
0
pavanred

代わりにこれはどうですか:

SELECT user.* FROM user JOIN userType on user.code = userType.code AND user.userType = userType.userType
0
Sam Holloway

私は似たようなことをしなければなりませんでしたが、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]) 

編集:今私が見ると、これは@ v1v3knの答えに非常に近いです

0
Rick Savoy