2015-05-01 1 views
3

Мне нужно получить определенные записи в TABLE_A - тогда вам нужно отобразить последний раз, когда строка была обновлена, - которая находится в TABLE_B (однако , есть много записей, которые коррелируют в TABLE_B). TABLE_A.PK TABLE_A является ID и ссылки на TABLE_B через TABLE_B.LINK, где схема будет:Необходимо получить все записи в таблице A и только один в таблице B, который является последним обновленным

TABLE_A 
=================== 
ID   NUMBER 
DESC  VARCHAR2 

TABLE_B 
=================== 
ID   NUMBER 
LINK  NUMBER 
LAST_DATE DATE 

И фактические данные таблицы будут:

TABLE_A 
=================== 
100   DESCRIPTION0 
101   DESCRIPTION1 

TABLE_B 
=================== 
1  100 12/12/2012 
2  100 12/13/2012 
3  100 12/14/2013 
4  101 12/12/2012 
5  101 12/13/2012 
6  101 12/14/2013 

Итак, мне нужно что-то зачитывает:

Result 
==================== 
100 DESCRIPTION0 12/14/2013 
101 DESCRIPTION1 12/14/2013 

Я попытался соединить различные способы, но ничего не похоже на работу:

select * from 
(SELECT ID, DESC from TABLE_A WHERE ID >= 100) TBL_A 
full outer join 
(select LAST_DATE from TABLE_B WHERE ROWNUM = 1 order by LAST_DATE DESC) TBL_B 
on TBL_A.ID = TBL_B.LINK; 
+0

Если у вас есть какой-либо выбор в этом вопросе, имя столбца DESC делает для некоторых жесткого читаемого SQL, так как это ключевое слово для ORDER BY. Заставляет меня хотеть сделать таблицу со столбцами «SELECT», «FROM», «ON», чтобы сделать SQL немного сложнее читать не-компьютеры. –

ответ

1

Легче всего сделать было бы присоединиться к table_a с совокупным запроса на table_b:

SELECT table_a.*, table_b.last_date 
FROM  table_a 
LEFT JOIN (SELECT link, MAX(last_date) AS last_date 
      FROM  table_b 
      GROUP BY link) table_b ON table_a.id = table_b.link 
+0

«LAST_DATE» не является столбцом в TABLE_A, поэтому при попытке я получаю ошибку: ORA-00904: «LAST_DATE»: неверный идентификатор для строки 1 – user2200186

+0

@ user2200186 действительно, mea culpa. Это должно быть «table_b.last_date» - исправлено. Спасибо, что заметили! – Mureinik

1

Если вы хотите самую последнюю дату, думаю, агрегацию и присоединиться. Дополнительные уровни подзапросов не помогают. Что-то вроде:

select a.id, a.desc, max(last_date) 
from table_a a join 
    table_b b 
    on a.id = b.link 
where a.id >= 100 
group by a.id, a.desc; 

Примечания: Я сомневаюсь, что full outer join необходимо, хотя вы можете сохранить, что если у вас есть присоединиться ключами, которые не соответствуют между таблицами. Возможно, подходит left join.

Я должен указать, что если вы хотите больше полей от b, то ваш первоначальный наклон для использования row_number() верен. Но запрос будет выглядеть следующим образом:

select a.id, a.desc, max(last_date) 
from table_a a left join 
    (select b.*, row_number() over (partition by link order by last_date desc) as seqnum 
     from table_b b 
    ) b 
    on a.id = b.link and b.seqnum = 1 
where a.id >= 100 
group by a.id, a.desc; 
+0

«LAST_UPDATE» не является столбцом в TABLE_A, поэтому при попытке получить: – user2200186

+0

Извините - нажмите неправильную кнопку. – user2200186

+0

«LAST_DATE» не является столбцом в TABLE_A, поэтому при попытке я получаю сообщение об ошибке: ORA-00904: «LAST_DATE»: недопустимый идентификатор – user2200186