SQL:IN子句的问题,如何返回所有值,甚至重复

时间:2011-09-15 07:56:26

标签: sql sql-server select

我想:

SELECT someID FROM table1 WHERE someID IN (1,1,2,2,3) 

返回

someID
1
1
2
2
3

虽然它现在只返回IN子句中的不同值,如下所示:

someID
1
2
3

我使用的是Microsoft SQL Server,我的表包含一个唯一的someID和PLSRec。

CREATE TABLE [dbo].[table1](
    [someID] [int] IDENTITY(1,1) NOT NULL,
    [PLSRec] [int] NOT NULL,
 CONSTRAINT [PK_table1] PRIMARY KEY CLUSTERED 
(

怎么样?:

DECLARE @table2 table(someID int)

INSERT INTO @table2(someID) VALUES (184),(132);

SELECT * FROM @table2 LEFT JOIN table1 ON @table2.someID=table1.someID

(INSERT INTO-sentence除了“'附近的语法不正确',')

4 个答案:

答案 0 :(得分:2)

它只会根据IN()的值来检查行的someID。

IN()的外观并不重要,它不会返回比匹配该值的行更多的结果。

答案 1 :(得分:2)

这只能通过Cartesian product,a.k.a。JOIN完成。在这种情况下,INNER JOIN。您需要创建一个包含所有这些值的行集,如下所示:

SELECT 1 as someID
UNION ALL SELECT 1 as someID
UNION ALL SELECT 2 as someID
[...]

然后,在JOIN子句中使用它(如果您使用的是MS SQL,则使用CTE)

SELECT table1.someID FROM table1
JOIN (SELECT 1 as someID
UNION ALL SELECT 1 as someID
UNION ALL SELECT 2 as someID
[...]
) as table2 on table1.someID=table2.someID

当然,这是一个非常难看的解决方案。

答案 2 :(得分:2)

我认为你误会了什么。

你的代码仅仅是语法糖
SELECT someID 
  FROM table1 
WHERE (
       someID = 1 
       OR someID = 1 
       OR someID = 2 
       OR someID = 2 
       OR someID = 3
      );

您的“IN子句”不是一个集合:如果您想要它,那么请使用表格,例如CTE,内联派生表,静态VIEW,表变量等。但请注意,集合没有重复的行!

答案 3 :(得分:-1)

我没试过,但是

SELECT someID, count(someID) FROM table1 WHERE someID IN (1,2,3) group by someID

可能符合您的目的。

或者

SELECT someID id1, someID id2 FROM table1 WHERE id1 IN (1,2,3) 

可能有效

编辑:哪个数据库?我正在使用Sybase SQLAnywhere,它确实返回多行。