我試圖用非CTE的方式來做到這一點。我使用子查詢,並在代碼中標記了它們。我不確定是否最好。這個答案是一個數據庫不可知論者。
這個查詢幫助我們爲更新選擇數據 -
select ini.id,
ini.maxend as opendt,
fin.opendt as enddt
from
(
select id, MAX(opendt) maxend
from mytable
where enddt is not null
group by id
) as ini -- subquery 1
inner join
(
select id, opendt
from mytable
where enddt is null
) as fin -- subquery 2
on ini.id = fin.id
現在我們將使用上面的查詢更新主表 -
從這樣的選擇更新的通用查詢像這 -
update t1
set
t1.enddt = t2.enddt
from mytable as t1
inner join (Something) as t2 -- something is a table or select
on (some-condition)
where (some-column = whatever)
這個是最終的結果 -
update t1
set
t1.enddt = t2.enddt
--select *
from mytable as t1
inner join
(
select ini.id,
ini.maxend as opendt,
fin.opendt as enddt
from
(
select id, MAX(opendt) maxend
from mytable
where enddt is not null
group by id
) as ini -- subquery 1
inner join
(
select id, opendt
from mytable
where enddt is null
) as fin -- subquery 2
on ini.id = fin.id
) as t2
on t1.id = t2.id
and t1.opendt = t2.opendt
示例表和行 -
CREATE TABLE [dbo].[mytable](
[opendt] [date] NULL,
[enddt] [date] NULL,
[id] [int] NULL
)
GO
INSERT [dbo].[mytable] ([opendt], [enddt], [id])
VALUES (CAST(0xA7360B00 AS Date), CAST(0xC6360B00 AS Date), 1)
INSERT [dbo].[mytable] ([opendt], [enddt], [id])
VALUES (CAST(0xC6360B00 AS Date), CAST(0x25380B00 AS Date), 1)
INSERT [dbo].[mytable] ([opendt], [enddt], [id])
VALUES (CAST(0xCE360B00 AS Date), NULL, 1)
INSERT [dbo].[mytable] ([opendt], [enddt], [id])
VALUES (CAST(0x49370B00 AS Date), CAST(0x4D370B00 AS Date), 2)
INSERT [dbo].[mytable] ([opendt], [enddt], [id])
VALUES (CAST(0x4D370B00 AS Date), CAST(0x50370B00 AS Date), 2)
INSERT [dbo].[mytable] ([opendt], [enddt], [id])
VALUES (CAST(0x57370B00 AS Date), NULL, 2)
是的!等我寫了SQL – AK47
你做了什麼事嗎? – KrazzyNefarious
你用什麼SQL Server版本? –