20

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

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

私はmssqlserver2008を使用しています


IN私はこれが結合で達成できることを知っており、存在します。私はそれが節で実行できるかどうかを知りたかっただけです。

4

8 に答える 8

16

あなたが投稿した方法ではありません。動作させるには、単一のフィールドまたはタイプのみを返すことができます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.

の代わりに、次の2つのフィールドをIN使用してを使用できます。JOIN

SELECT U.* 
FROM user U
  INNER JOIN userType UT
    ON U.code = UT.code
    AND U.userType = UT.userType
于 2010-12-15T16:49:41.083 に答える
10

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

select * from user u
where exists (select 1 from userType ut
              where u.code = ut.code
                and u.userType = ut.userType)
于 2010-12-15T16:51:21.110 に答える
5

のような恐ろしいものだけで

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

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

..これは、おそらく次のようなものに向かい始めることを意味します。

--if your SQLS supports CONCAT
select * from user
where CONCAT(code, CHAR(9), userType) in ( select CONCAT(code, CHAR(9), userType) from ... )

--if no concat
select * from user
where COALESCE(code, 'no code') + CHAR(9) + userType in ( 
  select COALESCE(code, 'no code') + CHAR(9) + userType from ... 
)

CONCATは、ほとんどのものの文字列連結を実行し、1つの要素がNULLの場合、出力全体をNULLに圧縮しません。CONCATがない場合は、concatを使用して文字列を作成します+が、nullの可能性があるものはすべて、その周りにCOALESCE / ISNULLが必要になります。どちらの場合も、CHAR(9)(タブ)のようなものが必要になります。それらが混ざり合うのを防ぐためにフィールド..フィールド間のものは、データに自然に存在しない南向きである必要があります。

残念なことに、SQLSはこれをサポートしていません。Oracleはこれをサポートしています。

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

しかし、おそらくDBを切り替える価値はありません。EXISTSまたはJOINを使用して、複数列のフィルターを実現します


つまり、結合を使用しない、または存在しないソリューションです。そして、それを使用すべきでない理由がたくさんあります;)

于 2015-03-26T16:40:31.657 に答える
0

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

SELECT user.* FROM user JOIN userType on user.code = userType.code AND user.userType = userType.userType
于 2010-12-15T16:50:04.323 に答える
0

結合を使用できます

SELECT * FROM user U 
INNER JOIN userType UT on U.code = UT.code 
AND U.userType = UT.userType
于 2010-12-15T16:54:08.490 に答える
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]) 

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

于 2015-11-13T18:01:26.037 に答える
-2

クエリは移植性が高いとは思いません。次のようなものを使用する方が安全です。

select * from user
where code in ( select code from userType ) and userType in (select userType from userType)
于 2010-12-15T16:51:30.750 に答える
-3
select * from user
where (code, userType) in ( select code, userType from userType );
于 2013-01-31T04:30:56.410 に答える