T-SQL - 选择使用SubQuery

时间:2014-07-10 10:54:01

标签: sql-server tsql

我有一个SQL查询,我在where子句中有一个IN条件的列表。

我的意思是:

WHERE Id IN (11111,11112) 

我尝试做的是以下内容:我有一个链接服务器查询,其中我有一个IN子句。

我有一个子查询,我使用JOIN表来交叉数据,但我需要在IN条件下使用与主查询相同的Id。

我希望你们明白我尝试做的事情:

这是我的代码:

SELECT 
Name, 
Street, 
Number,
(SELECT loginUser FROM [LinkedServer].[Database].[dbo].[Users] T1 
INNER JOIN [LinkedServer].[Database].[dbo].[General] T2
ON T2.IdUser = T1.Id
WHERE T2.Id IN (11111,11112,11113,11114,11115)
)
FROM [LinkedServer].[Database].[dbo].[General]
WHERE Id IN (11111,11112,11113,11114,11115)

我收到此错误:

  

子查询返回的值超过1。这是不允许的   子查询跟随=,!=,<,< =,>,> =或当子查询用作   表达。

3 个答案:

答案 0 :(得分:1)

要重复使用同一组ID,您可以使用表变量。

DECLARE @T TABLE(ID INT);

INSERT INTO T
SELECT 11111 UNION ALL SELECT 11112 ....

然后

SELECT * FROM    
(SELECT Varchar1, 
Varchar2, 
Varchar3, loginUser FROM [LinkedServer].[Database].[dbo].[Table] T1 
INNER JOIN [LinkedServer].[Database].[dbo].[Table] T2
ON T2.INT1 = T1.INT1
WHERE T2.Id IN (select id from @T)
) AS X WHERE
X.Id IN (select id from @T)

答案 1 :(得分:1)

考虑使用连接而不是相关子查询:

SELECT General.Name
     , General.Street
     , General.Number
     , Users.loginUser
FROM   [LinkedServer].[Database].[dbo].[General]
 LEFT
  JOIN [LinkedServer].[Database].[dbo].[Users]
    ON Users.Id = General.IdUser
WHERE  General.Id IN (11111, 11112, 11113, 11114, 11115)

这将尽可能返回loginUser

答案 2 :(得分:0)

我终于解决了。

问题是子查询没有提取特定Id的where条件。 如果没有WHERE条件,查询将返回多于1个值。

我做了什么:

  

感谢您的建议及其解决方案作者:“LIUFA”。

结合他的代码和我的代码的一些修正,我得到了解决方案。

我已添加一个列ID并为其添加别名。在子查询中,我从Temp表中完成了选择 使用where条件。它的工作。完美。

希望此解决方案可以帮助某人解决相关问题。

最后代码:

DECLARE @T TABLE(ID INT);
INSERT INTO @T
Select ReferenceId From MyBigData


SELECT,
A.Id,
Name, 
Street, 
Number,
(SELECT loginUser FROM [LinkedServer].[Database].[dbo].[Users] T1 
INNER JOIN [LinkedServer].[Database].[dbo].[General] T2
ON T2.IdUser = T1.Id
WHERE T2.Id IN (SELECT Id FROM @T WHERE Id = A.Id)
)
FROM [LinkedServer].[Database].[dbo].[General]
WHERE Id IN (SELECT Id FROM @T)