查找未激活的后续记录

时间:2013-04-20 09:28:26

标签: sql sql-server

我有一个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。

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

由于

的Darren

3 个答案:

答案 0 :(得分: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')

答案 1 :(得分: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' )

答案 2 :(得分: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'