2016-12-19 6 views
0

Мне нужно присоединиться к 2 видам view_a и view_b.
view_a имеет столбцы идентификатор, address1, address2, город, штат, Cntry view_b ID, frst_name, last_name, тип, дата, JOB_TITLEOracle Присоединиться к 2 просмотрам с 5 условиями

желаемого результата
идентификатор, имя, address1, address2, город, штат, Cntry , job_title

Условия для моего запроса:
1. присоединиться к обоим представлениям по столбцу id.
2. Порядок по дате по алфавиту
3. конкатенации first_name и last_name
4. тип равен «сотрудника»
5. Если существует более одного сотрудника затем дают лишь одного сотрудника, т.е., один верхний ряд на основе Дата.
6. Если в нем нет офицера, то для результата имя и столбец job_title имеют значение null.

запрос я использовал:

select 
     * 
    from 
     view_a A 
    join 
    (
      select 
       (first_name || ' ' || last_name) as name, 
       job_title, 
       id 
      from 
       view_b 
        where 
       type = 'officer' 
        and 
       id is not null 
      order by date desc fetch first 1 row only 
    ) B 
    on A.id=B.id 

Но этот запрос приносит только один результат. Я использую Oracle 12c. в этих представлениях есть около 800 тыс. записей.

ответ

1

Вы можете сделать это:

select id, 
    name, 
    address1, 
    address2, 
    city, 
    state, 
    cntry, 
    job_title 
(select 
    a.id, 
    nvl2(nvl(b.first_name, b.last_name),b.first_name||' '||b.last_name,null) Name, 
    a.address1, 
    a.address2, 
    a.city, 
    a.state, 
    a.cntry, 
    b.job_title, 
    a.date 
    row_number() over (partition by a.id order by a.date desc nulls last) rn 
from 
    view_a a left outer join 
    view_b b 
on a.id = b.id 
and b.type = 'officer') 
where rn = 1 
order by date desc nulls last; 
+0

этот запрос работает нормально, но я не получаю записи, если нет типа «Сотрудник», но мне нужно получить записи с этим столбцом как null – CodingFreak

+0

@CodingFreak Исправлено. Попробуйте сейчас? – GurV

0

Следующая также решить проблему:

SELECT * 
FROM view_a a 
    LEFT JOIN (SELECT name, job_title, id 
      FROM (SELECT (first_name || ' ' || last_name) AS name, 
         job_title, 
         id, 
         ROW_NUMBER() OVER(PARTITION BY id ORDER BY date DESC) rn 
        FROM view_b 
        WHERE TYPE = 'officer' AND id IS NOT NULL) 
      WHERE rn = 1) b 
     ON a.id = b.id