2

Oracle がこの奇妙な結果を返す理由がわかりません。コードは非常に明確だと思います。

No condition = (OUTER JOIN cond で NOT null) + (OUTER JOIN cond で null です)

表の外部結合列の IS NULL / IS NOT NULL を EXISTS / NOT EXISTS 条件と解釈するので。

なぜ私は間違っているのですか?

DESCRIPTION                          COUNT(1)
---------------------------------- ----------
No condition                             6403
is NOT null in OUTER JOIN cond           6403
is not null in where cond                6401
is null in OUTER JOIN cond               6247
is null in where cond                       2
proof flh_id_messaggio is not null          0
proof flh_stato is not null                 0


  SELECT 'is null in OUTER JOIN cond ' description, count(1)
    FROM    netatemp.TMP_BACKLOG_NOBILLING2013 t
         LEFT OUTER JOIN
            eni_flussi_hub c ON
            c.flh_id_messaggio = t.flh_id_messaggio  
            AND c.flh_stato is null   
   WHERE 1 = 1 
       And t.flh_stato = 'PA'
         AND t.OWNER = 'ETL' 
UNION
  SELECT 'is NOT null in OUTER JOIN cond ' description, count(1)
    FROM    netatemp.TMP_BACKLOG_NOBILLING2013 t
         LEFT OUTER JOIN
            eni_flussi_hub c ON
            c.flh_id_messaggio = t.flh_id_messaggio  
            AND c.flh_stato is not null   
   WHERE 1 = 1 
       And t.flh_stato = 'PA'
         AND t.OWNER = 'ETL'
UNION
  SELECT 'is null in where cond ' description, count(1)
    FROM    netatemp.TMP_BACKLOG_NOBILLING2013 t
         LEFT OUTER JOIN
            eni_flussi_hub c ON
            c.flh_id_messaggio = t.flh_id_messaggio                
   WHERE 1 = 1 
       And t.flh_stato = 'PA'
         AND t.OWNER = 'ETL'
         AND c.flh_stato is null 
UNION
  SELECT 'is not null in where cond ' description, count(1)
    FROM    netatemp.TMP_BACKLOG_NOBILLING2013 t
         LEFT OUTER JOIN
            eni_flussi_hub c ON
            c.flh_id_messaggio = t.flh_id_messaggio                
   WHERE 1 = 1 
       And t.flh_stato = 'PA'
         AND t.OWNER = 'ETL'
         AND c.flh_stato is not null 
UNION
  SELECT 'No condition' description, count(1)
    FROM    netatemp.TMP_BACKLOG_NOBILLING2013 t
         LEFT OUTER JOIN
            eni_flussi_hub c ON
            c.flh_id_messaggio = t.flh_id_messaggio                
   WHERE 1 = 1 
       And t.flh_stato = 'PA'
         AND t.OWNER = 'ETL'
UNION select 'proof flh_stato is not null' description, count(1)
from eni_flussi_hub
where flh_stato is null         
UNION select 'proof flh_id_messaggio is not null' description, count(1)
from eni_flussi_hub
where flh_id_messaggio is null  
4

1 に答える 1

3

EXISTS/NOT EXISTS同等のクエリは、句ではなく句にNULL条件を配置することによって取得されます。ちなみに、これはあなたの結果から私たちが観察したことです:WHEREOUTER JOIN

No condition                             6403
is not null in where cond                6401
is null in where cond                       2

メイン テーブルの 2 行には、結合されたテーブルに対応する ID がありません。


句に条件を配置すると、結合されたテーブルからの行のサブセット に対して、メイン テーブルにOUTER JOINOracle に通知されます。OUTER JOIN

は決して null ではないためc.flh_stato、条件は冗長であり、条件なしのクエリと同じ結果が得られます。

No condition                             6403
is NOT null in OUTER JOIN cond           6403

join 句の条件c.flh_stato IS NULLを使用して、メイン テーブルを空の結果セットに結合し、メイン テーブルの各行に対して 1 つの行を取得します (この条件では、メイン テーブルに 6247 行あると推測されます)。

is null in OUTER JOIN cond               6247
于 2013-06-19T14:22:28.103 に答える