20

是否可以在IN子句中包含多个字段?类似于以下内容:

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

我正在使用 ms sql server 2008


我知道这可以通过连接来实现并且存在,我只是想知道它是否可以通过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.

而不是IN,您可以使用 aJOIN使用两个字段:

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 )

然后,您必须管理空值和连接数字,而不是添加它们和强制转换,以及 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 将对大多数内容进行字符串连接,如果一个元素为 NULL,则不会将整个输出压缩为 NULL。如果您没有 CONCAT,那么您将使用 concat 字符串,+但任何可能为 null 的内容都需要 COALESCE/ISNULL 围绕它。无论哪种情况,您都需要 CHAR(9)(制表符)之类的东西字段以防止它们混合..字段之间的东西应该是数据中不自然存在的南向..

可惜 SQLS 不支持这一点,Oracle 支持:

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

但它可能不值得切换数据库;我会使用 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 回答