我有一个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。这是不允许的 子查询跟随=,!=,<,< =,>,> =或当子查询用作 表达。
答案 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)