2013-04-20 63 views
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。

我只想返回已取消且沒有激活的記錄。

感謝

達倫

+0

「但是這將返回我可能會被取消,取消,取消,活動記錄的DDIReference。」 - 呃,什麼? – 2013-04-20 09:31:15

+1

提供有關您的模式的一些信息。這很關鍵。 – 2013-04-20 09:31:19

回答

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') 
+0

感謝這3個選項。 Alexander Fedorenko,運行你的代碼只會返回30條記錄。 HVD,您的代碼將返回297條記錄 sivareddy,您的代碼將返回293條記錄。 4條記錄的區別在於記錄1:CAN,ACT,CAN記錄2:ACT,CAN記錄3:ACT,CAN記錄4:ACT,CAN 所以這些都是CAN沒有後續(更高的transactionID)ACT我想需要包括在內。 感謝大家的幫助,非常感謝。 – 2013-04-21 17:02:31

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') 
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'