SQL-запрос для поиска последних созданных записей в таблице

#sql #sql-server-2008 #sql-server-2012

#sql #sql-server-2008 #sql-server-2012

Вопрос:

У меня есть таблица с именем Tbl_Dom .

Столбцы являются

 ID, Original_id, name
  

Пример данных:

 Original_id    ID              Name
-------------------------------------
NULL          82051            DOM
82051         122575           SAT
122575        123598           sam
  

В этой таблице Id: 82051 был создан первым в этой таблице, затем была создана вторая запись на основе ID 82051 из первой записи (таким образом, будет создано n записей), на которые будет ссылаться ID: 122575.

При создании третьей записи исходный идентификатор будет ссылаться на два идентификатора второй записи: 122575, но в основном это из 82051.

Вопрос:Я знаю старый идентификатор: 82051 — используя это, как найти самый последний созданный идентификатор: 123598 из таблицы.

Я пытался выполнить это, но не смог получить ожидаемый результат.

 Select id 
from dom t 
where original_id in (select original_id from dom t1)
  

Мой ожидаемый результат :

 id: 123598  original id: 122575 name : sam
  

Комментарии:

1. всегда ли ID будет создаваться в инкрементном порядке?

2. Нет, он не создаст следующий номер приращения для этих записей.

Ответ №1:

Вы можете использовать рекурсивный CTE в сочетании с оконной функцией, как в:

 with
r as (
  select original_id, id, name, 1 as version from Tbl_Dom where ID = 82051
  union all
  select t.original_id, t.id, t.name, r.version   1
  from Tbl_Dom t
  join r on t.original_id = r.id
),
x as (
  select
    original_id, id, name,
    row_number() over(order by version desc) as rn
  from r
)
select original_id, id, name
from x
where rn = 1
  

Результат:

 original_id  id      name
-----------  ------  ----
122575       123598  sam
  

Рекурсивный CTE необходим для обхода всех уровней. В некоторых случаях вам может потребоваться пройти один уровень (или вообще ни одного), но в других случаях их может быть несколько.

Дополнительный запрос (по той же цене):

Кроме того, если (просто для развлечения?) вы хотели получить все более новые версии строки, которые вы могли сделать:

 with
r as (
  select original_id, id, name, 1 as version from Tbl_Dom where ID = 82051
  union all
  select t.original_id, t.id, t.name, r.version   1
  from Tbl_Dom t
  join r on t.original_id = r.id
)
select * from r order by version
  

Результат:

 original_id  id      name  version
-----------  ------  ----  -------
<null>       82051   DOM   1
82051        122575  SAT   2
122575       123598  sam   3
  

Комментарии:

1. этот показывает значение null в исходном идентификаторе: original_id id name rn NULL 82051 DOM 1 Я ожидаю id: 123598 исходный id: 122575

2. Теперь это исправлено.

Ответ №2:

подзапрос и левое соединение могут найти последнюю запись

     with Tbl_Dom as
(
select null Original_id,82051 as ID ,'DOM' as Name
union all
select 82051,122575,'SAT'
union all
select 122575,123598,'sam'
) select a.id from
    (
    select id from Tbl_Dom
    ) a left join
    (
    select Original_id as id from Tbl_Dom where Original_id  is not null
    ) b on a.id=b.id where b.id is null
  

вывод

 id
123598
  

демонстрационная ссылка

Комментарии:

1. Спасибо за публикацию. Здесь вы выбрали записи таблицы статически. Мой вопрос в том, как мы можем выделить эти записи по идентификатору: 82051 из таблицы