2013-09-26 33 views
1

此上下文可能没有帮助,但前提是:我正在为寄养中的客户提供展示位置记录。如果客户离家休息,或者如果他们的费率发生变化,或者他们改变了养父母,或者他们改变了子计划或其他一些原因,他们也会改变。我试图找出与当前的父母,费率和子程序具有相同养老金的最早的安置开始日期(并且不是暂缓)。克服子查询返回的值多于1个值

我创建了一个视图,该视图的最大展示位置不具有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 

我得到的子查询返回多个值。这是不允许的...错误。任何洞察我在做什么错误?还有,有什么办法可以添加到这种代码的情况下,如果这意味着如果提前放置不存在,列表最大放置从FcMaxNonRespPlcmntS2?

谢谢任何帮助

回答

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