跟进SQL查询以检索进程的最新状态

时间:2018-06-26 15:40:37

标签: sql-server

原始问题和架构显示在以下链接中: SQL query to retrieve the latest status of a process

@mendosi提供的解决方案是完美的。但是,由于提交截止日期已经过去,因此管理层需要更多信息。我已经可以使用以下查询(将上述解决方案合并到“ EXISTS”子句中)为他们提供所需的信息:

SELECT        
    proposalPackage.proposalPackageID, refProposalType.name, proposalPackage.title, 
    [user].lastName, [user].firstName, [user].email, [user].phone, 
    proposalReviewAction.approvalTypeID
FROM
    proposalReviewAction, proposalPackage 
INNER JOIN
    refProposalType ON proposalPackage.proposalTypeID = refProposalType.proposalTypeID 
INNER JOIN
    proposalManagerAssignment ON proposalPackage.proposalPackageID = proposalManagerAssignment.proposalPackageID 
INNER JOIN
    [user] ON proposalManagerAssignment.userID = [user].userID
WHERE
    EXISTS (SELECT ls.* 
            FROM 
                (SELECT 
                     r.proposalPackageID, r.approvalTypeID,
                     RowNr = ROW_NUMBER() OVER (PARTITION BY r.proposalPackageID ORDER BY r.reviewedDate DESC) 
                 FROM 
                     proposalReviewAction AS r
                 JOIN 
                     proposalPackage AS pp ON pp.proposalPackageID = r.proposalPackageID
                 WHERE 
                     pp.proposalCallID = 7) AS ls
            WHERE 
                ls.RowNr = 1
                AND (ls.approvalTypeID = 50))
GROUP BY 
    proposalPackage.proposalTypeID, [user].lastName, [user].firstName,
    [user].email, [user].phone, proposalPackage.title, 
    refProposalType.name, proposalManagerAssignment.isPrimary, 
    proposalPackage.proposalCallID, approvalTypeID, 
    proposalPackage.proposalPackageID, proposalReviewAction.approvalTypeID
HAVING        
    (proposalManagerAssignment.isPrimary = 1) 
    AND (proposalPackage.proposalCallID = 7) 
    AND (approvalTypeID = 50)
ORDER BY  
    proposalPackage.proposalPackageID

我的问题似乎是Exists子句中的子查询返回了95行(应如此),将结果限制为状态为50的那些行。

据我了解,EXISTS子句应将结果限制为在随后的子查询中“存在”的那些记录...对吗?因此,在这种情况下,如果子查询中不存在记录,则最终结果中将不存在该记录... ??

问题是,当子查询的结果列表中只有95条记录可供选择(或加入)时,我得到112条记录。

因此,我尝试通过添加一些附加的限定词和对子查询的连接来限制:

SELECT        
    proposalPackage.proposalPackageID, refProposalType.name, 
    proposalPackage.title, 
    [user].lastName, [user].firstName, [user].email, [user].phone, 
    proposalReviewAction.approvalTypeID
FROM            
    proposalReviewAction, proposalPackage 
INNER JOIN
    refProposalType ON proposalPackage.proposalTypeID = refProposalType.proposalTypeID 
INNER JOIN
    proposalManagerAssignment ON proposalPackage.proposalPackageID = proposalManagerAssignment.proposalPackageID 
INNER JOIN
    [user] ON proposalManagerAssignment.userID = [user].userID
WHERE
    EXISTS (SELECT ls.* 
            FROM 
                (SELECT 
                     r.proposalPackageID,
                     r.approvalTypeID,
                     RowNr = ROW_NUMBER() OVER (PARTITION BY r.proposalPackageID ORDER BY r.reviewedDate DESC) 
                 FROM
                     proposalReviewAction AS r
                 JOIN 
                     proposalPackage AS pp ON pp.proposalPackageID = r.proposalPackageID
                 WHERE 
                     pp.proposalCallID = 7) AS ls 
            WHERE 
                ls.RowNr = 1
                AND (ls.approvalTypeID = 50)) AS distinctified
INNER JOIN 
    proposalPackage ON distinctified.proposalPackageID = proposalPackage.proposalPackageID
INNER JOIN 
    refProposalApprovalType ON distinctified.approvalTypeID = refProposalApprovalType.approvalTypeID
GROUP BY 
    proposalPackage.proposalTypeID, [user].lastName, [user].firstName, 
    [user].email, [user].phone, proposalPackage.title, refProposalType.name, 
    proposalManagerAssignment.isPrimary, proposalPackage.proposalCallID, 
    approvalTypeID, proposalPackage.proposalPackageID, proposalReviewAction.approvalTypeID
HAVING        
    (proposalManagerAssignment.isPrimary = 1) 
    AND (proposalPackage.proposalCallID = 7) 
    AND (distinctified.approvalTypeID = 50)
ORDER BY  
    proposalPackage.proposalPackageID

现在,当我将带有几个JOINS的“ AS区分”语句添加到子查询时,我收到“ AS附近的语法错误”错误。

在每个“ HAVING”限定符上,我还会得到一个“期望(或SELECT)”。

我认为我并没有太复杂,但这仍然是可能的。在我看来,这是在某个地方忽略角色的问题。

提前感谢您的帮助...再次!

3 个答案:

答案 0 :(得分:0)

这实际上不是您更复杂的示例的答案,但它应该说明希望的根本原因是什么?

DECLARE @x TABLE (id INT);
INSERT INTO @x SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3;
DECLARE @y TABLE (id INT);
INSERT INTO @y SELECT 1 UNION ALL SELECT 3;

--This is what you are doing
SELECT * FROM @x WHERE EXISTS (SELECT * FROM @y);

--This is what you should be doing
SELECT * FROM @x x WHERE EXISTS (SELECT * FROM @y y WHERE y.id = x.id);

答案 1 :(得分:0)

我真的不知道您要完成什么,但这是带有一些别名和格式的查询的样子。我还将联接移到where子句之前,并删除了EXISTS谓词上的别名。但是您在代码中引用的是我所不了解的。因此,此查询中仍然存在一些问题,但是在不了解需要什么的情况下,我不知道该怎么做。

SELECT pp.proposalPackageID
    , pt.name
    , pp.title
    , u.lastName
    , u.firstName
    , u.email
    , u.phone
    , pra.approvalTypeID
FROM proposalReviewAction pra 
--,  proposalPackage pp --why is this table here? It is joined to again later
INNER JOIN refProposalType pt ON pp.proposalTypeID = pt.proposalTypeID 
INNER JOIN proposalManagerAssignment ma ON pp.proposalPackageID = ma.proposalPackageID 
INNER JOIN [user] u ON ma.userID = u.userID
INNER JOIN proposalPackage pp ON distinctified.proposalPackageID = pp.proposalPackageID
INNER JOIN refProposalApprovalType pat ON distinctified.approvalTypeID = pat.approvalTypeID
WHERE EXISTS 
(
    SELECT ls.* 
    FROM 
    (
        SELECT r.proposalPackageID,
            r.approvalTypeID,
            RowNr = ROW_NUMBER() OVER (PARTITION BY r.proposalPackageID ORDER BY r.reviewedDate DESC) 
        FROM proposalReviewAction AS r
        JOIN proposalPackage AS pp2 ON pp2.proposalPackageID = r.proposalPackageID
        WHERE pp2.proposalCallID = 7
    ) AS ls 
    WHERE ls.RowNr = 1
        AND ls.approvalTypeID = 50
)                 
GROUP BY pp.proposalTypeID
    , u.lastName
    , u.firstName
    , u.email
    , u.phone
    , pp.title
    , pt.name
    , ma.isPrimary
    , pp.proposalCallID
    , approvalTypeID
    , pp.proposalPackageID
    , pra.approvalTypeID
HAVING ma.isPrimary = 1
    AND pp.proposalCallID = 7
    AND distinctified.approvalTypeID = 50
ORDER BY pp.proposalPackageID

答案 2 :(得分:0)

所以,我弄清楚了...一旦意识到自己对EXISTS的理解有误(感谢@Richard Hansel)。最终查询:(正确设置格式和别名)

SELECT        pp.proposalPackageID
            , r_pt.name
            , pp.title
            , u.lastName
            , u.firstName
            , u.email
            , u.phone
            , pra.approvalTypeID
FROM          proposalReviewAction AS pra
            , proposalPackage AS pp
            INNER JOIN refProposalType AS r_pt ON pp.proposalTypeID = r_pt.proposalTypeID 
            INNER JOIN proposalManagerAssignment AS pma ON pp.proposalPackageID = pma.proposalPackageID 
            INNER JOIN [user] AS u ON pma.userID = u.userID
WHERE       EXISTS 
            (SELECT ls.* 
             FROM 
                     (SELECT r.proposalPackageID,
                             r.approvalTypeID,
                             RowNr = ROW_NUMBER() OVER (PARTITION BY r.proposalPackageID ORDER BY r.reviewedDate DESC) 
                      FROM   proposalReviewAction AS r
                             JOIN proposalPackage AS pp ON pp.proposalPackageID = r.proposalPackageID
                      WHERE  pp.proposalCallID = 7) AS ls 
              WHERE ls.RowNr = 1
                    AND (ls.approvalTypeID = 50)
                    AND (pra.proposalPackageID = pp.proposalPackageID))
GROUP BY pp.proposalTypeID
        , u.lastName
        , u.firstName
        , u.email
        , u.phone
        , pp.title
        , r_pt.name
        , pma.isPrimary
        , pp.proposalCallID
        , approvalTypeID
        , pp.proposalPackageID
        , pra.approvalTypeID
HAVING  (pma.isPrimary = 1) 
        AND (pp.proposalCallID = 7) 
        AND (pra.approvalTypeID = 50)
ORDER BY  pp.proposalTypeID