0

次のクエリがあります。

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ます。

このクエリに何か問題がありますか?

4

1 に答える 1

1

なぜデータを取得しているのかわかりません。いくつかのテーブルと挿入を使用して小さな例を作成できるかもしれません。

ただし、NOT IN演​​算子の使用は標準的ではないことを指摘できます。ほとんどの場合、INandNOT 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')

NULL のためNOT IN、一般に とNOT EXISTSは同等ではないことに注意してください。

于 2012-08-29T16:11:23.787 に答える