【问题标题】:Query not working as expected in stored procedure查询在存储过程中未按预期工作
【发布时间】:2015-05-30 07:10:19
【问题描述】:

下面是我的存储过程:

   ALTER PROCEDURE [dbo].[uspApprovalHistory]
        -- Add the parameters for the stored procedure here
                @empID int = null
    AS
    BEGIN
        declare @SRFTable table
        (SRFID nvarchar(50))
        declare @currSRFID nvarchar(50) = null
        -- SET NOCOUNT ON added to prevent extra result sets from
        -- interfering with SELECT statements.
        SET NOCOUNT ON;
        -- Insert statements for procedure here
        insert into @SRFTable
        Select distinct MasterCode from CallForwarding 
        Where EmployeeNo = @empID or ApproverNo = @empID;
        Select *  From callforwarding 
        Where  Mastercode in (select SRFID from @SRFTable)
              and ApproverNo = @empID
              and ForwardDate in (Select max(ForwardDate) from CallForwarding
                              where Mastercode in (select SRFID from @SRFTable)
                              and ApproverNo = @empID)
    END

为什么它没有按预期工作?它只返回一行,基于整个表中的最大转发日期。

我想要的是 SRFID = Mastercode 和 ForwardDate = Max(ForwardDate) 的所有行。一个 SRFID 有多个记录,并且有多个 SRFID。我想要所有带有 SRFID 的行,其中转发日期是最近的。所以最终结果将是等于最近转发的 SRFID 的行。

【问题讨论】:

    标签: sql sql-server stored-procedures sql-server-2012


    【解决方案1】:

    尝试使用GROUP BY

    Select *  From callforwarding 
    Where  Mastercode in (select SRFID from @SRFTable)
        and ApproverNo = @empID
        and ForwardDate in 
                   (Select max(ForwardDate) from CallForwarding
                    where Mastercode in (select SRFID from @SRFTable)
                    and ApproverNo = @empID
                    group by Mastercode)
    

    【讨论】:

    • 一个小组,整个世界都变了!感谢按预期工作。
    • 我猜这不是正确的答案。如果不同的主代码存在相同的日期,这可以为相同的主代码返回几个不同的转发日期。参见示例:sqlfiddle.com/#!3/f8be2/3
    • 你是对的,但对我来说不是。同一个 ID 的日期总是不同的。
    【解决方案2】:

    我认为这是你真正想要的:

    Select *  
    From Callforwarding c1
    Where  Mastercode in (select SRFID from @SRFTable)
    and ApproverNo = @empID
    and ForwardDate in 
    (
        Select max(c2.ForwardDate) 
        from CallForwarding c2
        where c2.Mastercode = c1.MasterCode
        and ApproverNo = @empID
    )
    

    这样,最大日期只能从特定的 Mastercode 中选择,而不是从所有的 Mastercode 中选择。

    其他替代方法是使用行号:

    select * from (
      select
        Mastercode,
        ForwardDate,
        row_number() over (
          partition by MasterCode order by ForwardDate desc) as RN
      from
        Callforwarding
      where
        Mastercode in (select SRFID from @SRFTable)
        and ApproverNo = @empID
    ) TMP where RN = 1
    

    SQL Fiddle 中的示例:Group byRow Number

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-13
      • 2013-01-05
      • 1970-01-01
      • 2015-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多