2016-12-02 12 views
0

私はどのユーザーがどの親スレッドにコメントしたかを示すこのようなテーブルを持っています。SQL内の2つの行の間に行を挿入

ParentID CommentID UserName CommentDateTime 
58   58  Vicky  2016-12-02 11:51:07.270 
58   61  Billu  2016-12-02 12:35:40.220 
58   62  Rakesh 2016-12-02 12:37:42.133 

コメントが2行目に行われているとし、新しいcommentidが、私は以下の順序で行をリストSQLクエリを作成したい63

ですが生成される場合:

ParentID CommentID UserName CommentDateTime 
58   58  Vicky  2016-12-02 11:51:07.270 
58   61  Billu  2016-12-02 12:35:40.220 
61   63  Rakesh 2016-12-02 13:37:42.133 
58   62  Rakesh 2016-12-02 12:37:42.133 

ロジック/ SQLを書く際に私を助けてください。

+0

どのように多くの回答することができます与えられた親コメントには?回答数が変わることはありますか? –

+7

SQLデータは本質的に**順序付けられていません** - **既存の2つの行の間に行を挿入することはできません**これはテーブルの最後に追加するだけです。テーブルからデータを選択して明示的に 'ORDER BY'節を指定すると、** order **が得られます... –

+0

既存テーブルを削除し、再度テンポラリテーブルを使用して再入力することができます。 – Susang

答えて

1

もし私が正しいと思えば、レコードを必要な順序で出力し、テーブルに挿入しないようにします。ここで私は投稿の木が見えるので、あなたは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  ║ 
╚══════════╩═══════════╩══════════╩═════════════════════════╩══════════╩═════════════╝ 
+0

Valex、yes i上記のような値を表示できるCTEのようなクエリが必要です。私はあなたのコードを統合しましたが、結果は空白です。あなたがこのリンクを "http://stackoverflow.com/review/suggested-edits/14271418"​​のところで使用した場合、私は親の下に子供を示す最初の質問をし、答えを得ました。今問題は、新しいユーザーが親の下にコメントする場合、そのコメントが親の下に表示されることです。あなたは与えられたリンクでもテーブル構造を得ることができます。 – Vikash

+0

@Vikash:投稿ツリーの構造が空であると思います。同じではありません。この(現在の)質問では、開始ポストは自分自身へのリンクを持っています(58,58)。以前の質問では、開始ポストは代わりに 'replycommentIId = NULL'を持っています。それで正しいのは、WHERE CommentID = T.ParentID' => 'WHERE CommentID IS NULL'と2番目の条件' WHERE T.CommentID <> T.ParentID '=>' WHERE T.CommentIDがNULLではない'。それが助けになるでしょう。 – valex

+0

@Vikash:私は[あなたの以前の質問への回答として私の答えの適応はそれを使用してください]を追加しました(http://stackoverflow.com/a/40933557/1554034) – valex

関連する問題