Как сделать заказ в рамках заказа в SQL? - PullRequest
1 голос
/ 17 ноября 2011

Я пытаюсь создать оператор SQL, который воссоздает иерархическую структуру контейнера / папки / теста в SilkCentral Test Manager.

Silk Ordering - Screen Shot

  • Тестовые контейнеры не имеютParentID
  • Папки тестов содержат ParentID и IsLeaf = 0
  • Тесты содержат ParentID и IsLeaf = 1

Этот запрос приводит ко всем контейнерам тестов, папками тесты:

SELECT "NodeID", "ParentID", "Name", "IsLeaf", "OrderNumber"
FROM "Silk"."TM_TestPlanNodes" AS TPN
WHERE PROJECTID = 36
ORDER BY "ParentID", "OrderNumber", "IsLeaf"

Вот некоторые из результатов:

NodeID  ParentID    Name                        IsLeaf  OrderNumber 
65408               Installation and Upgrades   0       0   
65445               Connectivity                0       1   
65448               Focus                       0       2   
65409               GINA / PLAP                 0       3   
65446               Graphical User Interface    0       4   
71038               Login Properties            0       5   
65449               Miscellaneous               0       6   
70636               Net Firewall                0       7   
70998               Software Updates            0       8   
65447               Third-party Services        0       9   
70805               SilkTest Automated Tests    0       10  
68812   65408       0. Setup                    0       0
65454   65408       1. Installations & Upgrades 0       1   
65450   65408       Typical/Custom Installation 0       2   

Я хотел бы вместо этого упорядочить: Silk Ordering

ParentID отсортирован,но если существует узел с ParentID = thePreviousNode'sID, то он выбирается следующим.Если таких узлов несколько, они должны быть упорядочены IsLeaf, а затем OrderNumber.

Как это сделать?Я очень ограничен в том, что я могу сделать, потому что я думаю, что очень сложный синтаксис в конечном итоге приведет к ошибкам в Silk.Я собирался попробовать вложенный оператор SELECT:

SELECT "NodeID", "ParentID", "Name","IsLeaf" 
FROM "Silk"."TM_TestPlanNodes" 
WHERE PROJECTID = '36'AND ParentID LIKE (
  SELECT ParentID 
  FROM "Silk"."TM_TestPlanNodes" 
  WHERE NAME = 'Installation and Upgrades')

Но появляется следующее сообщение об ошибке: «Не удалось выполнить запрос отчета: подзапрос возвратил более 1 значения. Это недопустимо, если подзапрос следует =,! =, <, <=,>,> = или когда подзапрос используется в качестве выражения. "

Вот почему я возился с Order By.

Ответы [ 2 ]

2 голосов
/ 17 ноября 2011

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

WITH cte (NodeID, ParentID, Name, IsLeaf, [Order])
AS
(
    SELECT NodeID, ParentID, Name, IsLeaf, cast(NodeID as nvarchar(10))
    FROM "Silk"."TM_TestPlanNodes" 
    WHERE PROJECTID = '36'
    UNION ALL
    SELECT "NodeID", "ParentID", "Name","IsLeaf", cast(leftNode.ParentID as nvarchar(10)) + cast(leftNode.NodeID as nvarchar(10))
    FROM "Silk"."TM_TestPlanNodes" as leftNode
    INNER JOIN cte on cte.NodeID = leftNode.ParentID
    WHERE leftNode.ParentID = cte.NodeID
)
select  "NodeID", "ParentID", "Name","IsLeaf"  from cte
order by cast([Order] as nvarchar(50))

Это было написано в блокноте, поэтому возможны некоторые ошибки, но идея состоит в том, чтобы создать столбец [order], который, например, для 65530 будет 654086554569530 (parent_parent , родитель и узел)

EDIT

это работает, только если все идентификаторы имеют длину 5 символов, но отсюда вы можете сделать правильные настройки.

1 голос
/ 17 ноября 2011

Хотя это может не быть ИДЕАЛЬНОЕ соответствие, оно очень близко к вложенному иерархическому представлению записей родитель-потомок в самосоединяющемся списке и включает в себя правильные проблемы упорядочения.Возможно, вам придется немного подправить его для вашей таблицы, но вот ссылка на предыдущее решение

Чтобы прояснить эту проблему с меню и соответствующими данными.

id    |     parentid     |       name
1     |        0         |      CatOne
2     |        0         |      CatTwo
3     |        0         |      CatThree
4     |        1         |      SubCatOne
5     |        1         |      SubCatOne2
6     |        3         |      SubCatThree

Желаемый вывод

CatOne 1
--SubCatOne 4
--SubCatOne2 5
CatTwo 2
CatThree 3
--SubCatThree 6

Первый случай - это предварительная группировка всех идентичных идентификаторов на основе родительского ... Итак, когда родительский идентификатор равен 0, это самый верхний уровень, поэтомумы держим это удостоверение личности.Затем, для всех детей, находящихся под ним, нам нужны соответствующие идентификаторы PARENT, чтобы все они были правильно сгруппированы.

Цель группы ВТОРАЯ - заставить запись, представляющую фактический элемент меню TOP LEVEL, в верхней части списка независимо от дочерних записей.

Допустим, у вас есть таблица, в которой идентификаторы уже установлены, и теперь вы добавляете новый элемент в позицию с идентификатором = 7 для «Нового верхнего уровня» и хотите переместить идентификаторы № 2 и 3 вновый "раздел верхнего уровня . Если вы просто выполните запрос с первым CASE, ваши записи будут смоделированы и возвращены как

ID   Parent   Name  (natural order from the table)
2    7        CatTwo
3    7        CatThree
7    0        New Category.  (we want THIS one in FIRST POSITION of the group)

Как видите, это было бы плохим представлениемпорядок подгруппы. Элемент верхнего уровня фактически находится на 3-ей позиции ... Чтобы вывести его на передний план, мы сейчас подгруппируемся и говорим ... если Parent ID записи = 0, то сортируем егокак если бы это был приоритет «1». Все остальное считается приоритетом «2» и имитирует результат, например

ID   Parent   Name             SubPrioritySort
7    0        New Category.    1
2    7        CatTwo           2
3    7        CatThree         2

Поскольку вы фактически не возвращаете эти значения «CASE» в запросе результата,иначе вы бы не увидели это визуально ... но для ухмылки добавьте их как столбцы к вашему запросу, чтобы увидеть влияние. Надеюсь, это прояснило ответ для вас.

В вашем вопросе вы, очевидно, сможетедобавить свой сстолбец ort order на основе этого запроса.

...