2012-02-12 117 views
2

我想运行一个SQL查询(SQL Server),它将从子查询中查找一个名称列表。从一个表中选择值,其中=另一个值?

我有这个,但我得到一个“子查询返回多于1”的错误:

SELECT FirstName + ' ' + LastName AS Name 
FROM Members 
WHERE  
    (MemberGUID = (SELECT ClassDetails.Leader 
        FROM Members AS Members_1 
        INNER JOIN MemberDetails ON Members_1.MemberGUID = MemberDetails.Member 
        INNER JOIN ClassDetails ON ClassDetails.Class = Members_1.CurrentClass 
        WHERE  
         (MemberDetails.JoiningDate >= '02/03/2012') 
         AND (Members_1.FirstName = '*') 
         OR (MemberDetails.JoiningDate >= '02/03/2012') 
         AND (Members_1.LastName = '*') 
         OR (MemberDetails.JoiningDate >= '02/03/2012') 
         AND (MemberDetails.Email IS NULL) 
         AND (MemberDetails.MobilePhone IS NULL) 
         AND (MemberDetails.WorkPhone IS NULL) 
         AND (MemberDetails.HomePhone IS NULL) 
         AND (Members_1.CurrentClass <> 339) 
         AND (Members_1.CurrentClass <> 696) 
         AND (Members_1.CurrentClass <> 0))) 

我需要这个返回值FirstNameLastName在子查询返回的每一个值。 (该子查询返回应该被输入到WHERE MemberGUID声明中的GUID列表)

这怎么办?

回答

1

随口说说,我想你可以只改变MemberGUID =MemberGUID IN

如错误消息所述,您的子查询正在返回多行,并且您无法将单个值与多个行的集合进行比较。但你可以寻找那个值那些行,这正是IN运营商所做的。

MSDN Reference

+0

点到你,因为你最后一刻落败Guffa几秒;) 非常感谢完美! - 是否可以列出名称旁边的出现次数?即'Myles Gray | 5',因为一些GUID出现几次,这个数字很重要? – 2012-02-12 16:07:26

+1

这是可能的,但不是没有你的一部分重构。简而言之,我认为最简单的做法是创建一个CTE或一个保存GUID和它们的计数的临时表。 (类似于'SELECT Id,Count(Id)FROM ... WHERE ... GROUP By Id')然后加入'Member',从'Member'和从CTE/Temp表中选择名字。 – 2012-02-12 16:21:26

+0

@MylesGray:你应该选择最好的答案,不一定是第一个答案。此外,如果你检查时间,我的回答是第一个... – Guffa 2012-02-12 16:39:22

2

使用in而不是=

... 
WHERE (MemberGUID in (...)) 

你也可以让它加入而不是使用子查询:

SELECT FirstName + ' ' + LastName AS Name 
FROM Members m1 
INNER JOIN Members AS Members_1 ON m1.MemberGUID = ClassDetails.Leader 
... 
1

在子查询中添加DISTINCT

SELECT FirstName + ' ' + LastName AS Name 
FROM Members 
WHERE MemberGUID IN 
     (SELECT DISTINCT ClassDetails.Leader 
     FROM Members AS Members_1 INNER JOIN MemberDetails 
        ON Members_1.MemberGUID = MemberDetails.Member 
      INNER JOIN ClassDetails 
       ON ClassDetails.Class = Members_1.CurrentClass 
     WHERE (MemberDetails.JoiningDate >= '02/03/2012') 
         AND (Members_1.FirstName = '*') 
         OR (MemberDetails.JoiningDate >= '02/03/2012') 
         AND (Members_1.LastName = '*') 
         OR (MemberDetails.JoiningDate >= '02/03/2012') 
         AND (MemberDetails.Email IS NULL) 
         AND (MemberDetails.MobilePhone IS NULL) 
         AND (MemberDetails.WorkPhone IS NULL) 
         AND (MemberDetails.HomePhone IS NULL) 
         AND (Members_1.CurrentClass <> 339) 
         AND (Members_1.CurrentClass <> 696) 
         AND (Members_1.CurrentClass <> 0))) 
相关问题