0

我有一个 DD 信息表,我需要从中选择任何已取消但没有后续活动记录的记录

我努力了

select 
    d1.DDIReference 
FROM DDI d1
LEFT OUTER JOIN DDI d2 ON (d1.DDIReference = d2.DDIReference AND d1.TransactionID < d2.TransactionID)
INNER JOIN [TM113 File for Jo to Check] tm on tm.[DDI Reference] = d1.DDIReference
WHERE 
    d1.DDStatus = 'CAN'
AND d2.DDStatus <> 'ACT'

但这将返回我可以取消、取消、取消、活动的记录的 DDIReference。

我只想返回已取消且没有活动的记录。

谢谢

达伦

4

3 回答 3

1

我不完全确定我是否正确理解了您的问题,但是此查询获取已取消的记录,其中不TransactionID存在更高的活动记录。请注意,与您的原始查询一样,如果CAN存在多个具有状态的记录,您将在每条记录的结果中获得一行。在这种情况下,您可以使用SELECT DISTINCT来避免这种情况。

SELECT d1.DDIReference 
FROM DDI d1
INNER JOIN [TM113 File for Jo to Check] tm on tm.[DDI Reference] = d1.DDIReference
WHERE d1.DDStatus = 'CAN'
AND NOT EXISTS(
    SELECT *
    FROM DDI d2
    WHERE d2.DDIReference = d1.DDIReference
    AND d2.TransactionID > d1.TransactionID
    AND d2.DDStatus = 'ACT')
于 2013-04-20T09:38:10.873 回答
0
select 
    d1.DDIReference 
FROM DDI d1
LEFT OUTER JOIN DDI d2 ON (d1.DDIReference = d2.DDIReference AND d1.TransactionID < d2.TransactionID)
INNER JOIN [TM113 File for Jo to Check] tm on tm.[DDI Reference] = d1.DDIReference
WHERE 
    d1.DDStatus = 'CAN'
AND d1.DDIReference  not in (select DDIReference from DDIReference  where DDStatus = 'ACT' )
于 2013-04-20T09:31:53.497 回答
0

您可以将选项与 OUTER APPLY + TOP 1 运算符一起使用

SELECT d1.DDIReference 
FROM DDI d1 INNER JOIN [TM113 File for Jo to Check] tm on tm.[DDI Reference] = d1.DDIReference
            OUTER APPLY (
                         SELECT TOP 1 d2.DDStatus
                         FROM DDI d2
                         WHERE d1.DDIReference = d2.DDIReference
                           AND d1.TransactionID < d2.TransactionID
                         ORDER BY d2.TransactionID DESC
                         ) o
WHERE d1.DDStatus = 'CAN' AND o.DDStatus <> 'ACT' 
于 2013-04-20T12:08:29.083 回答