2015-09-07 2 views
0

Я использую оператор union для объединения результатов из 2-х запросов. Теперь я хочу использовать результат первого запроса во втором запросе, чтобы я мог исключить некоторые записи из второго запроса.Использовать результат верхнего запроса в разделе union в нижнем запросе

E.g.

select <some_columns> from tableA Union select <same_columns> from tableA where <one_column_val> != <some_val_from_first_query> 

Ниже мой запрос

SELECT a.*, b.*, c.* 
    FROM tableA a, 
     tableB b, 
     tableC c 
    where b.field_1 = c.field_1 
    and a.field_2 = c.field_2 
union 
SELECT a.*, b.*, c.* 
    FROM tableA a, 
     tableB b, 
     tableC c 
    where b.field_1 = c.field_1 
    and a.field_3=c.field_3 
    and a.field_2 <> {a.field_2 from upper query} 

Пожалуйста, укажите требуемое изменение.

Заранее спасибо

ответ

0

Каждый выбрать в SQL союз не имеет знаний о других. Таким образом, вам просто нужно явно выписать весь запрос еще раз, в вашем случае либо как НЕ СУЩЕСТВУЕТ, либо НЕ ВХОД. В качестве примера, вы можете увидеть весь запрос скопированный в качестве производной таблицы в NOT EXISTS положение:

SELECT a.*, b.*, c.* 
    FROM tableA a, 
     tableB b, 
     tableC c 
    where b.field_1 = c.field_1 
    and a.field_2 = c.field_2 
union 
SELECT a.*, b.*, c.* 
    FROM tableA a, 
     tableB b, 
     tableC c 
    where b.field_1 = c.field_1 
    and a.field_3=c.field_3 
    and not exists (
     select 1 
     from (
      SELECT a.*, b.*, c.* 
      FROM tableA a, 
       tableB b, 
       tableC c 
      where b.field_1 = c.field_1 
      and a.field_2 = c.field_2 
     ) x 
     where a.field_2 = x.field_2 
    ) 

Если RDBMS поддерживает КТР вы можете абстрагировать запрос в КТР и не повторять себя. Обратите внимание, что, вероятно, вы также должны использовать синтаксис JOIN, если ваша RDBMS поддерживает его, и вы можете столкнуться с именами столбцов с селектором *, который вам нужно будет решить.

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