Вы должны всегда включать то, что говорит вам документация. (Реализации стандартной библиотеки C ++ часто пишутся так, чтобы функции были доступны через другие включения, но, конечно, полагаясь на это, означает, что ваш код не переносим.) Обратите внимание, что в C. нет стандартной функции getline
Но есть один в C ++:
std::getline()
определен в заголовке
. Стандарт C ++ не гарантирует, что в общем случае функции C доступны в глобальном масштабе или даже являются частью стандартной библиотеки C ++. Два языка начали свое расхождение много лет назад, и поэтому идея о том, что C ++ является в некотором смысле надмножеством C-библиотек, - это миф.
Ссылка: https://en.cppreference.com/w/cpp/string/basic_string/getline
.
Для получения связанных значений необходимо выполнить в нем с.
К виду необходимо добавить порядок в последнем выборе.
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
) чтобы это работало.
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
Но мне не нравится такое решение, где необходимо для броска. Есть ли какое-либо лучшее решение?