Sql 为什么在传递重复值(value1,value1….)时,运算符中返回不同的选择

Sql 为什么在传递重复值(value1,value1….)时,运算符中返回不同的选择,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,使用SQLServer2008 为什么IN运算符在选择重复值时返回不同的值 表@temp 当我执行这个查询时 SELECT * FROM @temp WHERE x IN (1,1) 它会回来的 x | 1 | 2 | 3 --+------------+-------------+------------ 1 | first 1 | first 2 | first 3 如何使其返回以下内容: x | 1

使用SQLServer2008

为什么IN运算符在选择重复值时返回不同的值

表@temp

当我执行这个查询时

SELECT * FROM @temp WHERE x IN (1,1) 
它会回来的

x |      1     |       2     |      3
--+------------+-------------+------------
1 |   first 1  |    first 2  |    first 3
如何使其返回以下内容:

x |      1     |       2     |      3
--+------------+-------------+------------
1 |   first 1  |    first 2  |    first 3
1 |   first 1  |    first 2  |    first 3

在这种情况下,有什么替代方法?

如果要返回重复项,则需要将查询表示为联接。in只是在每行上测试一个条件。条件是否满足一次或两次并不重要-行要么保留在中,要么被过滤掉

with xes as (
      select 1 as x union all
      select 1 as x
     )
SELECT *
FROM @temp t join
     xes
     on t.x = xes.x;
编辑:

如果您有子查询,则更简单:

select *
from @temp t join
     (<subquery>) s
     on t.x = s.x

这将是连接的正常使用。

您也可以使用交叉连接吗?如果您有类似于“SELECT*FROM表”的内容,其中col从另一个表中选择x,该怎么办_table@FreshPrinceOfSO . . . 您可以使用交叉连接,然后使用where子句进行筛选。“不过,我认为这是一种糟糕的风格。”戈登林诺夫我只是好奇而已。谢谢你的解释!
select *
from @temp t join
     (<subquery>) s
     on t.x = s.x