簡體   English   中英

SQL 排序依據和更新列

[英]SQL Order By and Update a Column

我在這個 SO 問題中列出了相同的問題,但我已經嘗試了解決方案,但我收到了 SQL 錯誤 1288-我認為我無法將 SQL 服務器轉換為 SQL,或者此方法已被棄用。 目前有這樣做的方法嗎?

我需要按列排序,然后遍歷我的新列,添加新訂單並更好地維護以備將來插入和刪除。 我當前用於更新新列的 SQL 查詢如下所示(與上面給出的解決方案相同):

With cte As
    (
    SELECT ColumnToOrderBy,NewColumn,
    ROW_NUMBER() OVER (ORDER BY ColumnToOrderBy) AS i
    FROM TableToUpdate
    )
UPDATE cte SET NewColumn=i

我繞過一個 cte,剛剛創建了一個包含兩個必要列的顯式臨時表,運行 ROW_NUMBER function,然后將原始表的列設置為新的排序臨時列。 代碼如下:

CREATE TEMPORARY TABLE temp 
    (ColumnToOrderBy INT,
    NewColumn INT);
INSERT INTO temp
    SELECT PrimaryKey,
    ROW_NUMBER() OVER (ORDER BY ColumnToOrderBy) AS NewColumn
    FROM TableToUpdate;
UPDATE TableToUpdate update
INNER JOIN temp t ON update.ColumnToOrderBy= t.ColumnToOrderBy
SET update.NewColumn= t.NewColumn;

DROP TABLE temp;

如果使用大表,我不認為這是一個快速或有效的解決方案,但對於一個小的修復,這是可行的。

您的代碼不起作用,因為 MySql 不支持(尚)可更新的 ctes。

假設ColumnToOrderBy是唯一的或主鍵,因此順序是唯一定義的,您可以在UPDATE語句中使用自連接來實現:

UPDATE TableToUpdate t
INNER JOIN (SELECT *, ROW_NUMBER() OVER (ORDER BY ColumnToOrderBy) rn FROM TableToUpdate) r
ON r.ColumnToOrderBy = t.ColumnToOrderBy
SET t.NewColumn = r.rn;

請參閱演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM