【问题标题】:Show documents stored procedure -- how to select twice-approved documents.显示文档存储过程——如何选择二次审核的文档。
【发布时间】:2013-12-02 20:41:51
【问题描述】:

我有一个场景,当任何用户第一次上传文档时,它会被批准。首先它会交给主管。当主管批准/拒绝文件时,只有批准的文件才会交给经理。然后,当经理批准/拒绝文件时,只有批准的文件才会提交给董事进行最终批准。

这是当前的存储过程:

ALTER PROCEDURE [dbo].[ALLDOCUMNETS]
   AS
 begin

  SELECT     dbo.DocumentInfo.DocID as DocumentID, 
   dbo.DocumentInfo.DocName as DocumentName, 
   dbo.DocumentInfo.Uploadfile as FileUploaded, 
    dbo.Userss.Email as UserEmail,
    dbo.Department.DepType as Department, 

    dbo.DocType.DocType as Document,
      dbo.DocumentInfo.UploadedBy as UploadedBy, 
      dbo.Approval.AppoveBy, dbo.ApproveType.ApproveType as Status
     FROM         dbo.DocumentInfo INNER JOIN
                  dbo.Approval ON dbo.DocumentInfo.DocID = dbo.Approval.DocID 
        inner JOIN dbo.Userss on Userss.UserName =dbo.DocumentInfo.UploadedBy inner 
           JOIN
                  dbo.ApproveType ON dbo.Approval.ApproveID =     
         dbo.ApproveType.ApproveID INNER JOIN
                  dbo.Department ON dbo.DocumentInfo.DepID = dbo.Department.DepID 
         INNER JOIN
                  dbo.DocType ON dbo.DocumentInfo.DocTypeID = dbo.DocType.DocTypeID

              end

这个 sp 的输出如下所示:

在上面,kanez 是经理,sundus 是主管。

我只想向主管出示经过 kanez 批准的文件以供最终批准。现在,主管和经理批准的文件都发给主任,但我只想向主任显示经理批准的文件。

我该怎么做?

表格

【问题讨论】:

    标签: sql sql-server stored-procedures


    【解决方案1】:

    如果您提供示例数据/表结构,那么我会提供比这更好的解决方案。

    如果不工作,以下解决方案的任何方式都可以工作,然后我将提供另一个解决方案(如果发送结构)。

    我假设 DocId 对于所有文档都是唯一的。

    ALTER PROCEDURE [dbo].[ALLDOCUMNETS]
       AS
     begin
    ;with x as 
      (SELECT   ROW_NUMBER() over (partition by dbo.DocumentInfo.DocID
      ORDER BY dbo.Approval.seqno desc) ID,   dbo.DocumentInfo.DocID as DocumentID,
       dbo.DocumentInfo.DocName as DocumentName, 
       dbo.DocumentInfo.Uploadfile as FileUploaded, 
    dbo.Userss.Email as UserEmail,
    dbo.Department.DepType as Department, 
    
    dbo.DocType.DocType as Document,
      dbo.DocumentInfo.UploadedBy as UploadedBy, 
      dbo.Approval.AppoveBy, dbo.ApproveType.ApproveType as Status
     FROM         dbo.DocumentInfo INNER JOIN
                  dbo.Approval ON dbo.DocumentInfo.DocID = dbo.Approval.DocID 
        inner JOIN dbo.Userss on Userss.UserName =dbo.DocumentInfo.UploadedBy inner 
           JOIN
                  dbo.ApproveType ON dbo.Approval.ApproveID =     
         dbo.ApproveType.ApproveID INNER JOIN
                  dbo.Department ON dbo.DocumentInfo.DepID = dbo.Department.DepID 
         INNER JOIN
                  dbo.DocType ON dbo.DocumentInfo.DocTypeID = dbo.DocType.DocTypeID
    
              end) SELECT DocumentID,DocumentName,FileUploaded,UserEmail,
              Department,Document,UploadedBy,AppoveBy,Status from x where X.Id=1
    

    表结构不好。

    在上一个查询中将 updateddate 更改为 seqno desc,

    然后你会得到最后更新的人记录他是什么

    【讨论】:

    • (我删除了我之前的评论,因为您的回答使他的目标比问题更清晰。)干得好......但是当他们存在时,上面不会给他经理批准,否则也给他SUPERVISOR批准?要为他提供经理批准的文档,请修改您的逻辑以选择具有 2 种不同批准的文档。使用上述方法,仅当 where X.Id=2 ALSO EXISTS 时才报告 where X.Id=1(例如,加入其中)。或者:使用 GROUP BY 加入 SELECT,并为该 GROUP BY 提供 HAVING COUNT(*) > 1HAVING MIN(dbo.Approval.seqno) <> MAX(dbo.Approval.seqno)
    猜你喜欢
    • 1970-01-01
    • 2019-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-18
    相关资源
    最近更新 更多