もし私が正しいと思えば、レコードを必要な順序で出力し、テーブルに挿入しないようにします。ここで私は投稿の木が見えるので、あなたはrecursive CTEを使うべきだと思います。各ノードのために、我々はパス文字列を構築し、並べ替え、このパス文字列使用しているノード:私はここでは例のテーブルにノードを追加しました
WITH CTE AS
(
SELECT ParentID, CommentID, UserName, CommentDateTime,
ParentID as ThreadID,
CAST(ParentID as varchar(MAX)) as PathStr
FROM T
WHERE CommentID = T.ParentID
UNION ALL
SELECT T.ParentID, T.CommentID, T.UserName, T.CommentDateTime,
CTE.ThreadID,
PathStr+'-'
+CAST(T.CommentID as varchar(MAX)) as PathStr
FROM T
JOIN CTE ON CTE.CommentID = T.ParentID
WHERE T.CommentID <> T.ParentID
)
SELECT * FROM CTE ORDER BY ThreadID,PathStr
は結果である:
╔══════════╦═══════════╦══════════╦═════════════════════════╦══════════╦═════════════╗
║ ParentID ║ CommentID ║ UserName ║ CommentDateTime ║ ThreadID ║ PathStr ║
╠══════════╬═══════════╬══════════╬═════════════════════════╬══════════╬═════════════╣
║ 58 ║ 58 ║ Vicky ║ 2016-12-02 11:51:07.270 ║ 58 ║ 58 ║
║ 58 ║ 61 ║ Billu ║ 2016-12-02 12:35:40.220 ║ 58 ║ 58-61 ║
║ 61 ║ 63 ║ Rakesh ║ 2016-12-02 13:37:42.133 ║ 58 ║ 58-61-63 ║
║ 58 ║ 62 ║ Rakesh ║ 2016-12-02 12:37:42.133 ║ 58 ║ 58-62 ║
║ 158 ║ 158 ║ Vicky ║ 2016-12-02 11:51:07.270 ║ 158 ║ 158 ║
║ 158 ║ 161 ║ Billu ║ 2016-12-02 12:35:40.220 ║ 158 ║ 158-161 ║
║ 161 ║ 163 ║ Rakesh ║ 2016-12-02 13:37:42.133 ║ 158 ║ 158-161-163 ║
║ 161 ║ 164 ║ Rakesh ║ 2016-12-02 13:37:42.133 ║ 158 ║ 158-161-164 ║
║ 158 ║ 162 ║ Rakesh ║ 2016-12-02 12:37:42.133 ║ 158 ║ 158-162 ║
╚══════════╩═══════════╩══════════╩═════════════════════════╩══════════╩═════════════╝
どのように多くの回答することができます与えられた親コメントには?回答数が変わることはありますか? –
SQLデータは本質的に**順序付けられていません** - **既存の2つの行の間に行を挿入することはできません**これはテーブルの最後に追加するだけです。テーブルからデータを選択して明示的に 'ORDER BY'節を指定すると、** order **が得られます... –
既存テーブルを削除し、再度テンポラリテーブルを使用して再入力することができます。 – Susang