SQl Query: необходимо получить последние созданные данные в дочерних записях - PullRequest
0 голосов
/ 17 февраля 2012

У меня есть требование, в котором мне нужно получить последние созданные данные в дочерних записях.

Предположим, есть две таблицы A и B. A - родитель, а B - дочерний. Они имеют отношение 1: M. Оба имеют несколько столбцов, и в таблице B есть один столбец «дата создания», который также содержит дату создания записи в таблице B.

Теперь мне нужно написать запрос, который может извлечь все записи из таблицы A и его последнюю созданную дочернюю запись из таблицы B. Предположим, что если сегодня в таблице B созданы две дочерние записи для родительской записи, то последняя из них должна получить выборку.

В одной записи таблицы A может быть много детей, так как же нам этого добиться?

Результат должен быть - Столбцы таблицы A, Столбцы таблицы B (последняя созданная)

Ответы [ 4 ]

1 голос
/ 17 февраля 2012

Я надеюсь, что «дата создания» - это столбец DATETIME. Это даст вам самую последнюю запись о детях. Предполагая, что у вас есть согласованный идентификатор в родительской таблице с тем же ParentID в дочерней таблице, что и внешний ключ ....

select A.*, B.*
from A 
join B on A.ParentID = B.ParentID
join (
  select ParentID, max([created date]) as [created date]
  from B
  group by ParentID
  ) maxchild on A.ParentID = maxchild.ParentID 
where B.ParentID = maxchild.ParentID and B.[created date] = maxchild.[created date]
0 голосов
/ 19 февраля 2012

Вы можете использовать аналитические функции , чтобы избежать ударов по каждой таблице (или, в частности, B) более одного раза

Использование CTE для предоставления фиктивных данных для A и B васможно сделать это:

with A as (
    select 1 as id from dual
    union all select 2 from dual
    union all select 3 from dual
),
B as (
    select 1 as a_id, date '2012-01-01' as created_date, 'First for 1' as value
        from dual
    union all select 1, date '2012-01-02', 'Second for 1' from dual
    union all select 1, date '2012-01-03', 'Third for 1' from dual
    union all select 2, date '2012-02-01', 'First for 2' from dual
    union all select 2, date '2012-02-03', 'Second for 2' from dual
    union all select 3, date '2012-02-01', 'First for 3' from dual
    union all select 3, date '2012-02-03', 'Second for 3' from dual
    union all select 3, date '2012-02-05', 'Third for 3' from dual
    union all select 3, date '2012-02-09', 'Fourth for 3' from dual
)
select id, created_date, value from (
    select a.id, b.created_date, b.value,
        row_number() over (partition by a.id order by b.created_date desc) as rn
    from a
    join b on b.a_id = a.id
)
where rn = 1
order by id;

        ID CREATED_D VALUE
---------- --------- ------------
         1 03-JAN-12 Third for 1
         2 03-FEB-12 Second for 2
         3 09-FEB-12 Fourth for 3

Вы можете выбрать любые столбцы, которые вы хотите, из A и B, но вам нужно будет псевдоним их в подзапросе, если есть какие-либо с одинаковыми именами в обоихтаблицы.

Вам также может потребоваться пользователь rank() или dense_rank() вместо row_number для надлежащей обработки связей, если вы можете иметь дочерние записи с той же датой создания.

0 голосов
/ 17 февраля 2012

Это не самый эффективный, но будет работать (только SQL):

    SELECT [Table_A].[Columns], [Table_B].[Columns]
    FROM [Table_A]
    LEFT OUTER JOIN [Table_B]
    ON [Table_B].ForeignKey = [Table_A].PrimaryKey
    AND [Table_B].PrimaryKey = (SELECT TOP 1 [Table_B].PrimaryKey
                                FROM [Table_B]
                                WHERE [Table_B].ForeignKey = [Table_A].PrimaryKey
                                ORDER BY [Table_B].CREATIONDATE DESC)
0 голосов
/ 17 февраля 2012

Ниже приведен запрос, который может вам помочь.

select x, y from ( select a.coloumn_TAB_A x, b.coloumn_TAB_B y from TableA a ,
TableB b where a.primary_key=b.primary_key
and a.Primary_key ='XYZ' order by b.created_date desc) where rownum < 2

Здесь у нас есть две таблицы A и B, соединив их на основе первичных ключей, упорядочив их по столбцу даты создания таблицы B в порядке убывания.

Используйте этот вывод в качестве встроенного представления для внешнего запроса и выберите любой желаемый столбец, например x, y. где rownum < 2 (который будет извлекать последнюю запись таблицы B)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...