Нужна помощь в создании представления поверх запроса JOIN, которое должно возвращать только самое последнее значение.

Мне нужна помощь с моим SQL-запросом. У меня есть две таблицы, к которым мне нужно присоединиться, используя ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ, затем мне нужно создать представление базы данных для этого конкретного представления. Если я запускаю запрос на соединение для поиска имени A, мне нужно получить последний бренд «AP» этого A. Таблица 1

ID     name     address
-----------------------  
1      A         ATL
2      B         ATL

ТАБЛИЦА 2

ID     PER_ID    brand      DATEE
--------------------------------------------
1      1         MS           5/19/17:1:00pm
2      1         XB           5/19/17:1:05pm
3      1         AP           5/19/17:2:00pm
4      2         RO           5/19/17:3:00pm
5      2         WE           5/19/17:4:00pm

Я попробовал запрос a, который возвращает правильный результат, но у меня возникает проблема 1, когда я пытаюсь построить представление базы данных поверх соединения. Я пробовал запрос b, но когда я запрашиваю свое представление в разработчике oracle sql, я все равно получаю все результаты, но не последние.

запрос а:

SELECT * from table_1
left outer join table_2 on table_1.ID = Table_2.PER_ID
AND table_2.DATE = (SELECT MAX(DATE) from table_2 z where z.PER_ID = table_2.PER_ID)

Проблема 1

Error report -
ORA-01799: a column may not be outer-joined to a subquery
01799. 00000 -  "a column may not be outer-joined to a subquery"
*Cause:    <expression>(+) <relop> (<subquery>) is not allowed.
*Action:   Either remove the (+) or make a view out of the subquery.
           In V6 and before, the (+) was just ignored in this case.

Запрос 2:

SELECT * from table_1
    left outer join(SELECT PER_ID,brand, max(DATEE) from table_2 group by brand,PER_ID) t2 on table_1.ID = t2.PER_ID

person stevestark    schedule 19.05.2017    source источник


Ответы (1)


Используйте 1_:

select t1.id, t1.name, t1.address, t2.id as t2_id, t2.brand, t2.datee
from table_1 t1 left outer join
     (select t2.*,
             row_number() over (partition by per_id order by date desc) as seqnum
      from table_2 t2
     ) t2
     on t1.ID = t2.PER_ID and t2.seqnum = 1;

При определении представления вы должны иметь привычку явно перечислять столбцы.

person Gordon Linoff    schedule 19.05.2017
comment
Спасибо за ответ. Я попробовал ваш код на разработчике oracle sql, но теперь я получаю, что t2.brand является недопустимым квалификатором. - person stevestark; 19.05.2017
comment
просто проверьте все имена столбцов и псевдонимы, используемые для каждого. Это просто ошибка, возникающая, когда ссылка на столбец неверна. Мы не можем отлаживать без доступа к вашим таблицам (или полному ddl для этих таблиц). ps: я думаю, что порядок по дате описания должен быть упорядочен по дате описания) [отсутствует буква e] - person Paul Maxwell; 20.05.2017
comment
спасибо, я исправил. один вопрос, который у меня есть относительно этого решения. это самое быстрое решение? Если бы я хотел добавить таблицу 3,4,5 и выполнить левое внешнее соединение для каждой, будет ли у меня отставание? - person stevestark; 20.05.2017
comment
@стивестарк . . . Это очень разумное решение. Является ли он самым быстрым в любой конкретной ситуации, зависит от распределения значений в данных. - person Gordon Linoff; 21.05.2017