我想知道如何使用基于 PostsId 的 SQL 為多對多關系更新此表中的順序。所以我的表現在看起來像:
我正在使用 SQL Server

| 博客編號 | 帖子編號 | 命令 | |
|---|---|---|---|
| 1 | 1 | 1 | 0 |
| 2 | 2 | 1 | 0 |
| 3 | 3 | 2 | 0 |
| 3 | 4 | 2 | 0 |
| 3 | 5 | 3 | 0 |
| 3 | 6 | 3 | 0 |
但我想使用 SQL 將 Order 更新為:
| 博客編號 | 帖子編號 | 命令 | |
|---|---|---|---|
| 1 | 1 | 1 | 1 |
| 2 | 2 | 1 | 2 |
| 3 | 3 | 2 | 1 |
| 3 | 4 | 2 | 2 |
| 3 | 5 | 3 | 1 |
| 3 | 6 | 3 | 2 |
例如:ID 為 3 的博客是帖子中 ID 為 2 的第一個博客,ID 為 4 的博客是帖子中 ID 為 2 的第二個博客,等等......
我試過這個:
DECLARE @myVar int
SET @myVar = 0
UPDATE [dbo].[BlogPost]
SET @myVar = [Order] = @myVar 1
但后來我得到了這個:
| 博客編號 | 帖子編號 | 命令 | |
|---|---|---|---|
| 1 | 1 | 1 | 1 |
| 2 | 2 | 1 | 2 |
| 3 | 3 | 2 | 3 |
| 3 | 4 | 2 | 4 |
| 3 | 5 | 3 | 5 |
| 3 | 6 | 3 | 6 |
所以,我認為我應該在 WHERE 部分做一些事情(可能是 Distinct),但我不知道到底是什么。我可以用 C# 寫一些東西來做我想做的事,但我不知道如何用 SQL 寫這樣的東西。
uj5u.com熱心網友回復:
以物理方式維護行的順序或序列很少是一個好主意,并且可能導致資料不一致和其他不可預見的問題。
您最好創建一個視圖,該視圖提供您可以使用的附加Order列row_number()
Create view BlogPosts as
select *,
Row_Number() over(partition by PostsId order by BlogsId) as [Order]
from blogpost;
如果你真的想更新表中的實際列,你可以使用CTE
with b as (
select *,
Row_Number() over(partition by PostsId order by BlogsId) as seq
from blogpost
)
update b
set [Order] = seq;
uj5u.com熱心網友回復:
您可以根據計算出的 row_number 進行更新。
update t set [Order] = rn from ( select BlogsId, PostsId, [Order] , rn = row_number() over (partition by PostsId order by BlogsId asc) from BlogPost ) t where ([Order] is null or [Order]!=rn);
select * from BlogPost order by BlogsId, PostsId
| 博客編號 | 帖子編號 | 命令 |
|---|---|---|
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 2 | 1 |
| 4 | 2 | 2 |
| 5 | 3 | 1 |
| 6 | 3 | 2 |
關于db<>fiddle 的演示在這里
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/389548.html
標籤:sql sql-server 查询语句
上一篇:如何在沒有函式呼叫的情況下從SELECT陳述句中的字串中提取字母或數字
下一篇:回傳每個單元格的第一個元素
