2011-07-27 165 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 

我加入电子邮件(子查询-incoludes“E” AS MAILADDRESS)和客户表。 有些客户不具有的emailadress所以我认为结果应该是像belowe条款:

MAILADDRESS  DISTINCT_COUNT 
YES      158945 
NULL      76345 

但是当我运行此查询时,只显示第一行(其电子邮件地址是YES)

如果我将EMAIL.MAILADDRESS子句更改为选定列中的nvl(EMAIL.MAILADDRESS,“否”)并逐个分组,查询运行完美。 但我无法解决问题,因为该查询是从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不显示空值?

回答

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 

客户表。这并不意味着你只会得到有电子邮件地址的记录(='YES')?

+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表中仍有记录,但其他列是空的,是否有可能?

如果是这样的话,我会如下改变你的子查询(其中,“地址”是包含电子邮件地址的实际列):

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