2011-07-27 10 views
0

ことで、私は以下のクエリがあります。オラクルヌル値問題

SELECT EMAIL.MAILADDRESS, COUNT (DISTINCT CUSTOMER.CUSTOMER_ID) distinct_count 
    FROM ( SELECT CUSTOMER_ID, 
         TRUNC (MAX (UPDATE_DATE)) AS UPDATE_TARIHI, 
         TRUNC (MIN (INSERT_DATE)) AS DATA_ENTRY_DATE, 
         'YES' AS MAILADDRESS 
       FROM ELECTRONIC_ADDRESS 
       WHERE ADDRESS_TYPE = 'ELECTRONIC' 
      GROUP BY CUSTOMER_ID) EMAIL 
     RIGHT OUTER JOIN 
      CUSTOMER 
     ON (EMAIL.CUSTOMER_ID = CUSTOMER.CUSTOMER_ID) 
GROUP BY EMAIL.MAILADDRESS 

を私は、電子メール(MAILADDRESS ASサブクエリ-incoludes「E」)と顧客テーブルを結合しています。

MAILADDRESS  DISTINCT_COUNT 
YES      158945 
NULL      76345 

しかし、私はこのクエリを実行すると、最初の行のみが示されている(そのメールアドレスYESである)

Iの場合: 一部の顧客がemailadressそれほど持っていない私は、その結果がbelowe句のようにすべきだと思いますEMAIL.MAILADDRESS節を選択した列とグループでnvl(EMAIL.MAILADDRESS、 'NO')に変更すると、クエリは完全に実行されます。 しかし、私は問題を解決できませんでした。そのクエリがBusiness Objects Universeから生成されたため、クエリを変更できません。

私たちは、この部分を書いている:

SELECT CUSTOMER_ID, 
        TRUNC (MAX (UPDATE_DATE)) AS UPDATE_TARIHI, 
        TRUNC (MIN (INSERT_DATE)) AS DATA_ENTRY_DATE, 
        'YES' AS MAILADDRESS 
      FROM ELECTRONIC_ADDRESS 
      WHERE ADDRESS_TYPE = 'ELECTRONIC' 
     GROUP BY CUSTOMER_ID 

をしてから、右を構築するには、この部分と顧客テーブル間の関係に参加します。

どうすれば問題を解決できますか?なぜOracleはnull値を表示していないのですか?

答えて

0

あなたは顧客テーブルにこのクエリ

select customer_id 
     ,trunc(max(update_date)) as update_tarihi 
     ,trunc(min(insert_date)) as data_entry_date 
     ,'YES' as mailaddress 
    from electronic_address 
    where address_type = 'ELECTRONIC' 
    group by customer_id 

に参加すると言います。電子メールアドレス(= 'はい')を持つレコードのみを取得するという意味ではありませんか?

+1

あなたは、最初のクエリを見てみるとこの部分が '右外部結合 'の左側にあることがわかります。 – Allan

1

次のSQLを使用すると、問題を再現できませんでした。

CREATE TABLE a1 (a NUMBER); 

CREATE TABLE a2 (a NUMBER); 

INSERT INTO a1 
    SELECT  LEVEL 
    FROM  DUAL 
    CONNECT BY LEVEL <= 10; 

INSERT INTO a2 
    SELECT  LEVEL 
    FROM  DUAL 
    CONNECT BY LEVEL <= 20; 

SELECT a1.a, COUNT(DISTINCT a2.a) 
FROM  a1 RIGHT OUTER JOIN a2 ON a1.a = a2.a 
GROUP BY a1.a; 

これは、問題がデータではなく、SQLにあることを示しています。顧客がELECTRONIC_ADDRESSテーブルにまだレコードがありますが、他の列がNULLである電子メールアドレスを持っていない場合は可能でしょうか?

その場合は以下のように、私はあなたのサブクエリを変更します(「アドレス」は、電子メールアドレスを含む実際の列です):

SELECT CUSTOMER_ID, 
      TRUNC (MAX (UPDATE_DATE)) AS UPDATE_TARIHI, 
      TRUNC (MIN (INSERT_DATE)) AS DATA_ENTRY_DATE, 
      CASE WHEN ADDRESS IS NULL 
       THEN NULL 
       ELSE 'YES' 
       END AS MAILADDRESS 
    FROM ELECTRONIC_ADDRESS 
    WHERE ADDRESS_TYPE = 'ELECTRONIC' 
GROUP BY CUSTOMER_ID