СОРТИРОВКА иерархических запросов в SQL Server 2005

Вы должны всегда включать то, что говорит вам документация. (Реализации стандартной библиотеки C ++ часто пишутся так, чтобы функции были доступны через другие включения, но, конечно, полагаясь на это, означает, что ваш код не переносим.) Обратите внимание, что в C. нет стандартной функции getline Но есть один в C ++:

std::getline()

определен в заголовке . Стандарт C ++ не гарантирует, что в общем случае функции C доступны в глобальном масштабе или даже являются частью стандартной библиотеки C ++. Два языка начали свое расхождение много лет назад, и поэтому идея о том, что C ++ является в некотором смысле надмножеством C-библиотек, - это миф.

Ссылка: https://en.cppreference.com/w/cpp/string/basic_string/getline

.

7
задан Cade Roux 23 January 2009 в 20:20
поделиться

2 ответа

Для получения связанных значений необходимо выполнить в нем с.

К виду необходимо добавить порядок в последнем выборе.

WITH tree (id, parentid, code, name) AS
(
    SELECT id, ofs.ParentID, ofs.code, ofs.name
      FROM OrganizationFeatures ofs
     WHERE ofs.ParentID IS NULL

    UNION ALL

    SELECT ofs.id, ofs.ParentID, tree.code+'/'+ofs.code, ofs.name
      FROM OrganizationFeatures ofs
      JOIN tree ON tree.ID = ofs.ParentID
)

select * from tree order by code

Кроме того, если код не является varchar, необходимо будет преобразовать столбцы кода в этом бите кода (tree.code+'/'+ofs.code) чтобы это работало.

4
ответ дан 7 December 2019 в 10:09
поделиться

Loki, у меня был подобный запрос, но он не отсортировал по имени, как я хотел, но кодом - это была пятница, и я был перегружен.

Так или иначе выполнение Вашего запроса дало мне ошибку, необходимо бросить; я должен был изменить его после пути:

WITH tree (id, parentid, name, code) AS
(
    SELECT id, ofs.ParentID, ofs.name, CAST(ofs.name as varchar(255))
      FROM OrganizationFeatures ofs
     WHERE ofs.ParentID IS NULL

    UNION ALL

    SELECT ofs.id, ofs.ParentID, ofs.name, CAST(tree.code+'/'+ofs.name as varchar(255))
      FROM OrganizationFeatures ofs
      JOIN tree ON tree.ID = ofs.ParentID
)

select * from tree order by code

Проблема состоит в том, что необходимо бросить к varchar несмотря на то, что имя является varchar. Довольно возможно, что varchar (255) не достаточно с большими деревьями.

Таким образом, я сделал версию, где вышеупомянутая проблема упоминания не является настолько большой:

WITH tree (id, parentid, name, code) AS
(
    SELECT id, ofs.ParentID, ofs.name, 
           CAST(ROW_NUMBER() OVER (ORDER BY ofs.name ASC) as varchar(255)) 
      FROM OrganizationFeatures ofs
     WHERE ofs.ParentID IS NULL

    UNION ALL

    SELECT ofs.id, ofs.ParentID, ofs.name, 
           CAST(tree.code +'/' + CAST(ROW_NUMBER() OVER (ORDER BY ofs.name ASC) as varchar(255)) as varchar(255))
      FROM OrganizationFeatures ofs
      JOIN tree ON tree.ID = ofs.ParentID
)

select * from tree order by code

Но мне не нравится такое решение, где необходимо для броска. Есть ли какое-либо лучшее решение?

2
ответ дан 7 December 2019 в 10:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: