2016-09-16 6 views
1

Я пытаюсь выбрать все уникальные строки из нескольких таблиц и где они одинаковы в таблицах, добавьте итоговые значения togther.Группа по значениям NULL

Это работает нормально, за исключением случаев, когда в столбце по двум таблицам указаны значения NULL. В каждой отдельной таблице они группируются вместе, но не соединяются в следующую таблицу.

CREATE TABLE t1(col1 VARCHAR2 (1),col2 VARCHAR2 (1)); 

INSERT INTO t1 VALUES ('A', 'A'); 
INSERT INTO t1 VALUES ('A', 'B'); 
INSERT INTO t1 VALUES (NULL, 'A'); 
INSERT INTO t1 VALUES (NULL, 'B'); 
CREATE TABLE t2 AS SELECT * FROM t1; 
INSERT INTO t1 VALUES (NULL, 'B'); 

Выберите запрос:

SELECT NVL (count_1, 0) + NVL (count_2, 0) AS TOTAL, col1, col2 
    FROM ( SELECT col1, col2, COUNT (1) count_1 
      FROM t1 
     GROUP BY col1, col2) t1 
     FULL OUTER JOIN ( SELECT col1, col2, COUNT (1) count_2 
          FROM t2 
         GROUP BY col1, col2) t2 
      USING (col1, col2) 

Результат:

TOTAL COL1 COL2 
2  A  A 
2  A  B 
1    A 
1    B 
2    B 
1    A 

Disired результат

TOTAL COL1 COL2 
2  A  A 
2  A  B 
2    A 
3    B 

Я попытался с помощью

nvl(col1,'N'), nvl(col2,'N') 

Однако это создает синтаксическую ошибку, поэтому я не использую ее правильно.

CASE WHEN col1 IS NULL THEN 'N' ELSE 'Y' END 

делает это хуже:

1 A A 
1 A B 
1  A 
2  B 
1 A Y 
1 A Y 
1  N 
1  N 

Как можно достичь желаемого результата?

ответ

2

Попробуйте это:

select count(*),col1,col2 from 
(
select col1,col2 from t1 
union all 
select col1,col2 from t2 
) 
group by col1,col2; 
+0

Это похоже на то, что я хочу с точки зрения результата (я должен проверить его на производительность, так как может быть причина, почему это должно было быть сделано таким образом). Я думаю, что самые простые варианты всегда самые лучшие! –

+0

Для вашего собственного тестирования, чтобы получить исходный запрос, вам необходимо изменить условие соединения полного внешнего соединения с 'using (col1, col2)' на что-то вроде 'ON (NVL (t1.col1, '{NULL } ') = NVL (t2.col1,' {NULL} ') И NVL (t1.col2,' {NULL} ') = NVL (t2.col2,' {NULL} ')) ' – Boneist