2012-08-29 21 views
0

我有以下查詢:Oracle查詢,檢查不存在於其他表

select vw.CONFERENCEID, alert.ALERTID, del.CHANNELID, del.DOCUMENTTEMPLATEID, 
     vw.starttime, vw.CONFERENCEID, alert.ALERTATTRIBUTEID, 
     alert.ALERTCATEGORYID, alert.ATTACHMENT, alert.ATTACHMENTLOCATION, 
     alert.ATTACHMENTNAME 
    from TBLMCONFERENCE vw, 
     TBLMSYSTEMALERTS alert, 
     TBLMALERTDELIVERYREL del, 
     tblmstandardmaster sm 
WHERE alert.Alertid = del.alertid 
    and sm.masterid = del.CHANNELID 
    and alert.SYSTEMGENERATED = 'N' 
    and alert.alertid not in (
     select sent.ALERTID 
     from TBLMSENTALERTHISTORY sent 
     where sent.REFACCOUNTID = vw.conferenceid 
      and sent.ALERTID = alert.ALERTID 
      and sent.CHANNELID = del.CHANNELID 
      and sent.RESETFLAG = 'N') 

我得到記錄,即使在TBLMSENTALERTHISTORY表中存在匹配的記錄。

這個查詢有什麼問題嗎?

+1

您是否嘗試過觸發內部查詢並檢查alertid是否存在於結果中? –

回答

1

我不確定你爲什麼獲取數據,也許你可以用一些表和插入來創建一個小例子。

不過,我可以指出你的NOT IN運營商的使用不規範:在大多數情況下,你不應該用INNOT IN運營商(它是多餘的)加入子查詢主查詢。相反,你可以這樣寫:

SELECT * 
    FROM TBLMCONFERENCE vw, 
     TBLMSYSTEMALERTS alert, 
     TBLMALERTDELIVERYREL del, 
     tblmstandardmaster sm 
WHERE alert.Alertid = del.alertid 
    AND sm.masterid = del.CHANNELID 
    AND alert.SYSTEMGENERATED = 'N' 
    AND (alert.alertid, del.CHANNELID, vw.conferenceid) 
     NOT IN (SELECT sent.ALERTID, sent.CHANNELID, sent.conferenceid 
       FROM TBLMSENTALERTHISTORY sent 
       WHERE sent.RESETFLAG = 'N') 

在你的情況,你可以直接與NOT EXISTS使用子查詢:

SELECT * 
    FROM TBLMCONFERENCE vw, 
     TBLMSYSTEMALERTS alert, 
     TBLMALERTDELIVERYREL del, 
     tblmstandardmaster sm 
WHERE alert.Alertid = del.alertid 
    AND sm.masterid = del.CHANNELID 
    AND alert.SYSTEMGENERATED = 'N' 
    AND NOT EXISTS 
      (SELECT sent.ALERTID 
      FROM TBLMSENTALERTHISTORY sent 
      WHERE sent.REFACCOUNTID = vw.conferenceid 
       AND sent.ALERTID = alert.ALERTID 
       AND sent.CHANNELID = del.CHANNELID 
       AND sent.RESETFLAG = 'N') 

注意,在一般NOT INNOT EXISTS是不等價的,because of NULLs

相關問題