2016-12-02 4 views
0

У меня есть таблица, подобная этой, которая показывает, какой пользователь прокомментировал какой родительский поток.Вставить строку между двумя строками в SQL

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 генерируется что 63

Я хочу написать SQL запрос, который перечислить строки в указанном ниже порядке:

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 по своей природе ** неупорядочены ** - поэтому вы ** не можете ** вставить строку между двумя существующими строками - добавьте ее только в конец таблицы. Вы только когда-либо получаете ** заказ **, когда вы выбираете данные из таблицы, и явно указываете предложение 'ORDER BY' ... –

+0

Вы можете удалить существующие и повторно ввести снова, организовав с помощью таблицы temp. – Susang

ответ

1

Если у меня все в порядке, вы хотите вывести записи в нужном порядке, не вставляя их в таблицу. Здесь мы видим TREE сообщений, поэтому я думаю, вы должны использовать recursive CTE. Для каждого узла мы строим строку PATH, а затем сортировать узлы, используя этот путь строку:

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/spected-edits/14271418», где я спросил первый вопрос, чтобы показать ребенка под родителем и получил ответ. Теперь проблема заключается в том, что новый пользователь комментирует родителя, его комментарий будет под родителем. Вы можете получить структуру таблицы также в данной ссылке. – Vikash

+0

@Vikash: Я думаю, что это пустое из-за структуры дерева сообщений не то же самое. В этом (текущем) вопросе стартовый пост получил ссылку на себя (58,58). В более раннем вопросе стартовый пост получил 'replycommentIId = NULL'. Так что просто правильно можно ответить и изменить два условия: WHERE CommentID = T.ParentID' => 'WHERE CommentID IS NULL' и второе условие' WHERE T.CommentID <> T.ParentID '=>' WHERE T.CommentID IS NOT NULL '. Это поможет. – valex

+0

@Vikash: Я добавил [адаптация моего ответа в качестве ответа на ваш предыдущий вопрос, пожалуйста, используйте его] (http://stackoverflow.com/a/40933557/1554034) – valex

Смежные вопросы