Oracle передовой союз - PullRequest
       8

Oracle передовой союз

0 голосов
/ 25 октября 2011

Существуют ли передовые методы Oracle SQL для решения такой ситуации?

Упрощенная: Два запроса возвращают primary_key_value и other_value . Оба запроса всегда возвращают primary_key_value, но other_value может быть нулевым.

Так как я могу объединить эти два запроса так, чтобы он всегда возвращал те строки, у которых есть other_value, но если оба запроса имеют other_value = null с одним и тем же первичным ключом, то должна быть возвращена только одна строка.

Я знаю, что это такой глупый случай. Но характеристики были такие:)

Пример: Первый запрос:

A  |  B
=======
1  | X
2  | 
3  | 
4  | Z

Второй запрос:

A  |  B
=======
1  | Y
2  | 
3  | Z
4  | 

Итак, результат должен быть таким:

A  |  B
=======
1  | X
1  | Y
2  | 
3  | Z
4  | Z

Ответы [ 3 ]

4 голосов
/ 25 октября 2011

Вы можете использовать аналитику:

SQL> WITH q1 AS (
  2     SELECT 1 a, 'X' b FROM DUAL UNION ALL
  3     SELECT 2 a, ''  b FROM DUAL UNION ALL
  4     SELECT 3 a, ''  b FROM DUAL UNION ALL
  5     SELECT 4 a, 'Z' b FROM DUAL
  6  ), q2 AS (
  7     SELECT 1 a, 'Y' b FROM DUAL UNION ALL
  8     SELECT 2 a, ''  b FROM DUAL UNION ALL
  9     SELECT 3 a, 'Z' b FROM DUAL UNION ALL
 10     SELECT 4 a, ''  b FROM DUAL
 11  )
 12  SELECT a, b
 13    FROM (SELECT a, b,
 14                 rank() over(PARTITION BY a 
 15                             ORDER BY decode(b, NULL, 2, 1)) rnk
 16             FROM (SELECT * FROM q1
 17                    UNION
 18                   SELECT * FROM q2))
 19   WHERE rnk = 1;

         A B
---------- -
         1 X
         1 Y
         2 
         3 Z
         4 Z
0 голосов
/ 26 октября 2011

Еще один способ взглянуть на то, что вы хотите, чтобы все возможные значения из объединения столбца A затем лево-внешние соединяли их с ненулевыми значениями из столбца B, таким образом, показывая нулевое значение в B, когда нет ненулевого значение для отображения.
примерно:

WITH q1 as (whatever),
     q2 as (whatever)
SELECT All_A.A, BVals.B
FROM (SELECT DISTINCT A FROM (SELECT A FROM q1 UNION SELECT A FROM q2)) All_A,
     (SELECT A,B FROM q1 WHERE B IS NOT NULL
      UNION
      SELECT A,B FROM q2 WHERE B IS NOT NULL) BVals
WHERE All_A.A = BVals.A (+)

Также явное удаление нежелательных нулей может выполнить ту же работу:

WITH q3 AS (q1_SELECT UNION q2_SELECT)
SELECT A,B
FROM q3 main
WHERE NOT ( B IS NULL AND
            EXISTS (SELECT 1 FROM q3 x WHERE main.A = x.A and x.B IS NOT NULL) )
0 голосов
/ 25 октября 2011

Если вы хотите использовать что-то действительно продвинутое, используйте предложение модели http://rwijk.blogspot.com/2007/10/sql-model-clause-tutorial-part-one.html Но в реальной жизни использование таких вещей обычно означает плохо спроектированную модель данных

...