克服子查询返回的值超过1

时间:2013-09-26 23:18:10

标签: sql-server

此上下文可能没有帮助,但如果是:我正在处理寄养客户的就业记录。如果客户离开家庭暂缓或者他们的费率变化,或者如果他们改变养父母,或者他们改变子程序或其他一些原因,他们会改变。我正在尝试确定最早的安置开始日期,其具有与当前的父母,费率和子程序相同的寄养父母,费率和子程序(并且不是暂缓的)。

我创建了一个视图,其最大放置位置没有RSPT状态。我现在正尝试使用以下代码找到他们最早的位置:

SELECT    MAX(PL.[PLCMNT ST DT]) AS MaxStDt, 
          PL.ProgID
FROM      dbo.PlacementLog AS PL 

          INNER JOIN dbo.ProgramLog AS PR ON 
          PL.ProgID = PR.[PROGRAM KEY]

WHERE     (PR.[PROGRAM CODE] = 29) AND 
          (PL.PlcmntStatus <> N'RSPT') AND 
          (PL.[PLCMNT ST DT] <
                               (SELECT     MaxStartDate
                                FROM       dbo.FcMaxNonRespPlcmntS2 AS FCM
                                WHERE      (ProgID = PL.ProgID) AND 
                                           (RCode = PL.[RATE CODE]) AND 
                                           (FosFamID = PL.FosFamID) AND 
                                           (SubProg = PL.SubProg)))
GROUP BY PL.ProgID, 
         PL.SubProg, 
         PL.[RATE CODE], 
         PL.FosFamID

我得到的Subquery返回的值超过1。这是不允许的......错误。对我做错了什么的任何见解?另外,有没有办法在这个代码中添加一个案例,如果早期放置不存在,列表是FcMaxNonRespPlcmntS2的最大位置?

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

您可以使用TOP 1ORDER BY

SELECT     MAX(PL.[PLCMNT ST DT]) AS MaxStDt, PL.ProgID
FROM         dbo.PlacementLog AS PL INNER JOIN
                      dbo.ProgramLog AS PR ON PL.ProgID = PR.[PROGRAM KEY]
WHERE     (PR.[PROGRAM CODE] = 29) AND (PL.PlcmntStatus <> N'RSPT') AND (PL.[PLCMNT ST DT] <
                          (SELECT     TOP 1 MaxStartDate
                            FROM          dbo.FcMaxNonRespPlcmntS2 AS FCM
                            WHERE      (ProgID = PL.ProgID) AND (RCode = PL.[RATE CODE]) AND (FosFamID = PL.FosFamID) AND (SubProg = PL.SubProg)
                            ORDER BY MaxStartDate DESC))
GROUP BY PL.ProgID, PL.SubProg, PL.[RATE CODE], PL.FosFamID