#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 из таблицы