問題
我有這張桌子。(您也可以在DBFiddle中查看。)
| ID | 版本 | 編號。 | 筆記 |
|---|---|---|---|
| 1 | 無效的 | 31 | |
| 2 | 1 | 31 | 可口 |
| 3 | 2 | 31 | 有點好吃 |
| 4 | 無效的 | 32 | |
| 5 | 1 | 32 | 嗯 |
| 6 | 2 | 32 | 好吧 |
| 7 | 3 | 32 | 極好 |
| 8 | 無效的 | 33 | 矛盾的 |
| 9 | 1 | 33 | 總的 |
| 10 | 2 | 33 | 嘔吐 |
第一列是主鍵。第 2 列和第 3 列是整數。第 4 列是 VARCHAR。
對于每個版本為 NULL 的唯一專案編號,我想查看版本值最高的記錄,獲取其備注欄位的內容,并將其復制過來。
這在視覺上更容易理解;命令運行后,表格應如下所示:
| ID | 版本 | 編號。 | 筆記 |
|---|---|---|---|
| 1 | 無效的 | 31 | 有點好吃 |
| 2 | 1 | 31 | 可口 |
| 3 | 2 | 31 | 有點好吃 |
| 4 | 無效的 | 32 | 極好 |
| 5 | 1 | 32 | 嗯 |
| 6 | 2 | 32 | 好吧 |
| 7 | 3 | 32 | 極好 |
| 8 | 無效的 | 33 | 矛盾的 |
| 9 | 1 | 33 | 總的 |
| 10 | 2 | 33 | 嘔吐 |
變更說明
- 對于第 31 項,“有點好吃”被復制了,因為它在版本號最高的記錄中,并且目標單元格未被占用。
- 對于第 32 項,出于同樣的原因,“fabulous”被復制了。
- 沒有復制“puke”來替換“ambivalent”,因為目標單元格已被占用。
問題
在 SQL Server 中實作此目的的查詢是什么?
我知道我需要一種按Item No.將記錄分組在一起的方法,找到具有最高Version值的那個,獲取它的Notes值,并將其復制到Version為 NULL 的記錄中,但是我無法將其轉換為SQL。
uj5u.com熱心網友回復:
嘗試這個:
UPDATE t SET notes = (
SELECT TOP 1 s.notes
FROM t s
WHERE s.item_no = t.item_no
ORDER BY version DESC
) WHERE version IS NULL AND notes IS NULL
檢查演示
uj5u.com熱心網友回復:
使用可更新的 CTE:
WITH cte AS (
SELECT *, FIRST_VALUE(Notes) OVER (PARTITION BY ItemNo ORDER BY Version DESC) newNotes
FROM tablename
)
UPDATE cte
SET Notes = newNotes
WHERE Version IS NULL AND Notes IS NULL;
請參閱演示。
uj5u.com熱心網友回復:
創建一個 CTE 以確定我們需要更新的值,然后使用更新連接語法將其連接到原始表:
with maxVal as
(
select row_number() over (partition by [Item No.] order by Version desc) rn
, notes
, [Item No.]
from TestTable
where Version is not null
)
update TestTable
set Notes = maxVal.Notes
from TestTable
left join maxVal
on TestTable.[Item No.] = maxVal.[Item No.]
and maxVal.rn = 1
where TestTable.Version is null
and TestTable.Notes = ''
uj5u.com熱心網友回復:
您可以為每個“ Item No. ”選擇最大值,然后用“ Notes ”為NULL的相應值更新原始表。
UPDATE tab
SET [Notes] = t2.[Notes]
FROM tab t1
INNER JOIN (SELECT *, MAX(Version) OVER(PARTITION BY [Item No.]) AS Max_Version
FROM tab) t2
ON t1.[Item No.] = t2.[Item No.]
AND t2.[Version] = t2.[Max_Version]
AND t1.[Notes] IS NULL
在此處查看演示。
uj5u.com熱心網友回復:
您可以嘗試這種方法:
-- Preparing a table variable
DECLARE @table1 AS TABLE (
id INT IDENTITY(1,1) NOT NULL,
VersionID INT,
ItemNo INT,
Note Varchar(50)
)
insert into
@table1 (VersionID,ItemNo,Note)
values
(NULL,31,''),
(1,31,'tasty'),
(2,31,'kinda tasty'),
(NULL,32,''),
(1,32,'meh'),
(2,32,'alright'),
(3,32,'fabulous'),
(NULL,33,'ambivalent'),
(1,33,'gross'),
(2,33,'puke');
-- update section
update up set up.Note = db.Note
from @table1 up
inner join
(
select a.ItemNo,a.Note
from @table1 a
inner join
(
select itemNo,Max(VersionID) as vs
from @table1
where Note <> ''
group by itemNo
) as b on a.ItemNo = b.ItemNo and a.VersionID = b.vs
) as db on db.ItemNo = up.ItemNo and up.Note = ''
-- result
select * from @table1
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/489866.html
