2013-03-08 3 views
0

У меня есть запрос sql. Я использую oracle 10g. здесь я совмещаю результаты обоих запросов.Удалить дублирующийся запрос sql?

select distinct combined.some_id from (
    SELECT DISTINCT l.some_id FROM tableA l where 
     l.some_code ='ABC' and l.code_two IN('S','H') 
     union all 
     SELECT DISTINCT e.some_id FROM tableA_Replica e where 
     e.some_code ='ABC' and e.code_two IN('S','H') and e.some_id NOT IN (SELECT DISTINCT l.some_id FROM tableA l where 
     l.some_code ='ABC' and l.code_two IN('S','H')) 
    ) combined,tableA_Replica_join_table_ONE x where 
     combined.some_id = x.some_id(+) 
     AND (x.status IN('ACTIVE','INACTIVE')) 


     UNION 

select distinct combined.some_id from (
    SELECT DISTINCT l.some_id FROM tableA l where 
     l.some_code ='ABC' and l.code_two IN('S','H') 
     union all 
     SELECT DISTINCT e.some_id FROM tableA_Replica e where 
     e.some_code ='ABC' and e.code_two IN('S','H') and e.some_id NOT IN (SELECT DISTINCT l.some_id FROM tableA l where 
     l.some_code ='ABC' and l.code_two IN('S','H')) 
    ) combined,tableA_Replica_join_table_TWO x where 
     combined.some_id = x.some_id(+) 
     AND (x.status IN('ACTIVE','INACTIVE')) 

в обоих запросах ниже часть является общей.

SELECT DISTINCT l.some_id FROM tableA l where 
     l.some_code ='ABC' and l.code_two IN('S','H') 
     union all 
     SELECT DISTINCT e.some_id FROM tableA_Replica e where 
     e.some_code ='ABC' and e.code_two IN('S','H') and e.some_id NOT IN (SELECT DISTINCT l.some_id FROM tableA l where 
     l.some_code ='ABC' and l.code_two IN('S','H')) 

Как я могу избежать дублирования кода в обоих запросах?

ответ

0

Вы можете использовать выражение общего таблицы (КТР, также иногда называют «С утверждением»):

WITH combined AS (
    SELECT DISTINCT l.some_id FROM tableA l where 
     l.some_code ='ABC' and l.code_two IN('S','H') 
     union all 
     SELECT DISTINCT e.some_id FROM tableA_Replica e where 
     e.some_code ='ABC' and e.code_two IN('S','H') and e.some_id NOT IN (SELECT DISTINCT l.some_id FROM tableA l where 
     l.some_code ='ABC' and l.code_two IN('S','H')) 
) 
SELECT distinct combined.some_id 
FROM combined, tableA_Replica_join_table_ONE x 
WHERE combined.some_id = x.some_id(+) 
     AND (x.status IN('ACTIVE','INACTIVE')) 

UNION 

SELECT distinct combined.some_id 
FROM combined, tableA_Replica_join_table_TWO x 
WHERE combined.some_id = x.some_id(+) 
     AND (x.status IN('ACTIVE','INACTIVE')) 
+0

Большое спасибо за ответ ур. запрос работает сейчас. в с предложением я делаю объединение двух запросов здесь, как я могу добавить порядок some_id? Пожалуйста, помогите мне .... – user1016403

+0

@ user1016403: Если вы хотите отсортировать результат UNION, вы можете сделать SELECT * FROM (... UNION ...) ORDER BY col' –

1

Этот запрос удаляет много дублирования:

select distinct combined.some_id from (
     SELECT distinct l.some_id FROM tableA 
      union 
     SELECT distinct e.some_id FROM tableA_Replica 
    ) combined 
    inner join (
     select x.status, x.some_id from tableA_Replica_join_table_ONE x 
      union 
     select y.status, y.some_id from tableA_Replica_join_table_TWO y 
    ) join_table 
    on combined.some_id = join_table.some_id(+) and 
     join_table.status IN('ACTIVE','INACTIVE') and 
     combined.some_code ='ABC' and l.code_two IN('S','H') 

Что запрос является лучше всего зависит от структуры ваших данных, всегда.

Одна вещь, которую вы определенно не должны делать:

SELECT DISTINCT l.some_id FROM tableA l where 
     l.some_code ='ABC' and l.code_two IN('S','H') 
     union all 
     SELECT DISTINCT e.some_id FROM tableA_Replica e where 
     e.some_code ='ABC' and e.code_two IN('S','H') and e.some_id NOT IN (SELECT DISTINCT l.some_id FROM tableA l where 
     l.some_code ='ABC' and l.code_two IN('S','H')) 

Вам не нужно, что пункт NOT IN во втором запросе. Просто используйте union вместо union all - это удаляет дубликаты автоматически.

Еще одна вещь, о которой стоит подумать: вы используете distinct в большом количестве мест. Вам действительно нужны все эти? Некоторые люди, по-видимому, используют distinct всюду как способ защиты от дубликатов. Однако это неэффективно и может привести к незначительным ошибкам, если вы не знаете точно, что он делает.

Как правило, используйте только distinct, когда вы специально решили, что вам нужно удалить дубликаты из определенного запроса. (Невозможно узнать, нужны ли вам все они, не видя ваши данные, но большое количество из них вызывает у меня подозрение).

Смежные вопросы