1

行のセットを取得し、すべての行のフィールドの番号を付け直す SQL クエリを構築しようとしています。それらはすべてセッション ID と一致する場所から始まります。

変更前の例:

SessionID  |  LineNumber  |  LineContents
----------------------------------------------
74666      |  1           | example content
74666      |  2           | some other content
74666      |  3           | another line
74666      |  4           | final line

変更後 (ユーザーが行 2 を削除したため、'LineNumber' 値が更新されて新しい番号が反映されました (つまり、行 '3' が行 '2' になりました):

SessionID  |  LineNumber  |  LineContents
----------------------------------------------
74666      |  1           | example content
74666      |  2           | another line
74666      |  3           | final line

したがって、これを適切でない構文に反映すると、これらの行に沿ったものになります

i = 0;
UPDATE tbl_name
SET LineNumber = i++;
WHERE SessionID = 74666;

運がなくてもこれをたくさん検索します。どんな助けも素晴らしいです:)

4

5 に答える 5

2

Row_Number()関数と の使用CTE:

;WITH CTE AS (
  SELECT SessionID, LineNumber, LineContents,
         Row_Number() OVER(PARTITION BY SessionID ORDER BY LineNumber) Rn
  FROM Table1 
)
UPDATE CTE
SET LineNumber = Rn
WHERE SessionID = 74666;

フィドルのデモ

于 2013-10-28T15:52:15.943 に答える
0

可能であればこれを別の方法で処理し、列を維持する必要がないように、その場で Linenumber を生成する傾向があります。たとえば、次のようになります。

CREATE TABLE dbo.T 
(   
    LineNumberID INT IDENTITY(1, 1) NOT NULL PRIMARY KEY, 
    SessionID INT NOT NULL,
    LineContents NVARCHAR(MAX) NOT NULL
);
GO
INSERT dbo.T (SessionID, LineContents)
VALUES 
    (74666, 'example content'),
    (74666, 'some other content'),
    (74666, 'another line'),
    (74666, 'final line');
GO
CREATE VIEW dbo.V
AS
    SELECT  LinenumberID,
            SessionID,
            Linenumber = ROW_NUMBER() OVER(PARTITION BY SessionID ORDER BY LinenumberID),
            LineContents
    FROM    dbo.T;
GO

このビューでは、必要なものが提供されます。次のように削除すると、次のようになります。

SELECT  *
FROM    dbo.V;

DELETE  dbo.V
WHERE   SessionID = 74666
AND     Linenumber = 3;

SELECT  *
FROM    dbo.V;

次の出力が得られます。

LINENUMBERID    SESSIONID   LINENUMBER  LINECONTENTS
1               74666       1           example content
2               74666       2           some other content
3               74666       3           another line
4               74666       4           final line


LINENUMBERID    SESSIONID   LINENUMBER  LINECONTENTS
1               74666       1           example content
2               74666       2           some other content
4               74666       3           final line

SQL Fiddle の例

したがって、実際にフィールドを更新することなく、連続した行番号フィールドを維持できます。CreatedDateもちろん、これはフィールド ( 、または ID 列など) に基づいて並べ替えることができる場合にのみ機能します。それ以外の場合は、トリガーを使用してそれを維持し、他の回答で提案されているようにステートメントを更新する必要があります。

于 2013-10-28T16:09:05.030 に答える