Получение оператора SQL для вывода таблицы в определенном порядке - PullRequest
0 голосов
/ 20 июня 2011

Я занимаюсь тестовым интернет-магазином, в котором есть разделы внутри разделов. Может быть неограниченное количество уровней, поэтому у меня всего одна таблица Section.

Таблица имеет следующие столбцы:

SectionID, SectionTitle, SectionLevel, ParentID, PageOrder

SectionLevel: 1 - самый верхний (без родителя)

PageOrder: в родительской группе, в каком порядке он должен идти.

А для данных испытаний:

SectionID  SectionTitle  SectionLevel  ParentID  PageOrder
---------  ------------  ------------  --------  ---------
2          Ladies        1             0         2
3          Mens          1             0         3
4          Jewellery     2             2         1 
5          Clothing      2             2         2
6          Clothing      2             3         1 
7          Accessories   2             3         2

Я хочу вернуть эти данные в одну таблицу, чтобы первый раздел верхнего уровня был первым, а затем - все его дочерние разделы, а затем второй раздел верхнего уровня и т. Д.

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

Данные должны возвращаться в следующем порядке:

SectionID  SectionTitle  SectionLevel  ParentID  PageOrder
---------  ------------  ------------  --------  ---------
2          Ladies        1             0         2
4          Jewellery     2             2         1 
5          Clothing      2             2         2
3          Mens          1             0         3
6          Clothing      2             3         1 
7          Accessories   2             3         2

Ответы [ 4 ]

1 голос
/ 20 июня 2011
WITH tree (SectionID, ParentID, SectionLevel, SectionTitle) AS
(
    SELECT SectionID, ofs.ParentID, ofs.SectionLevel, ofs.SectionTitle
     FROM Section ofs
     WHERE ofs.ParentID = 0
     ORDER BY SectionID

    UNION ALL

    SELECT SectionID, ofs.ParentID, ofs.SectionLevel, ofs.SectionTitle
      FROM Section ofs
      JOIN tree ON tree.ID = ofs.ParentID
      ORDER BY PageOrder
)
0 голосов
/ 20 июня 2011

Вот беспорядочное решение, о котором я говорилдобавление еще одного внешнего соединения и упорядочения по предложению).

0 голосов
/ 20 июня 2011

Это довольно сложно в SQL.Если у вас есть доступ к Safari Books, в есть несколько соответствующих разделов «Деревья и иерархии Джо Селко в SQL для умных людей» .

0 голосов
/ 20 июня 2011

Это намеренно слегка наивно, чтобы мне было легче на пальцах.При необходимости его можно настроить, чтобы можно было разместить больше узлов в дереве.

DECLARE
  @maxPageOrder INT,
  @maxLevel     INT,
  @multiplier   INT

SELECT
  @maxPageOrder  = MAX(PageOrder) + 1,
  @maxLevel      = MAX(SectionLevel)
FROM
  Section

SELECT
  @multiplier = POWER(@maxPageOrder, @maxLevel - 1)    
;

WITH
  recursed_tree
AS
(
  SELECT
    SectionID                      AS SectionID,
    PageOrder * @multiplier        AS finalOrder,
    @multiplier / @maxPageOrder    AS multiplier
  FROM
    Section
  WHERE
    ParentID = 0

  UNION ALL

  SELECT
    child.SectionID,
    parent.finalOrder + child.PageOrder * parent.multiplier,
    parent.multiplier / @maxPageOrder
  FROM
    recursed_tree  AS parent
  INNER JOIN
    Section        AS child
      ON child.ParentID = parent.SectionID
)

SELECT
  Section.*
FROM
  Section
INNER JOIN
  recursed_tree
    ON Section.SectionID = recursed_tree.SectionID
ORDER BY
  recursed_tree.finalOrder

Примечание. При этом предполагается, что все порядки страниц начинаются с 1, а не с 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...