Рекурсивный CTE является лучшим способом построить родительскую/дочернюю иерархию следующим образом:
-- Set up test data
CREATE TABLE tbl_codes (id INT , Parent_id INT, Code VARCHAR(3), NAME VARCHAR(12), Market INT)
INSERT tbl_codes
SELECT 1, NULL, '1ex', 'name 1', 3 UNION ALL
SELECT 2, 1 , '2ex', 'name 2', 3 UNION ALL
SELECT 3, 1 , '3ex', 'name 3', 3 UNION ALL
SELECT 4, NULL , '4ex', 'name 4', 1 UNION ALL
SELECT 5, NULL , '5ex', 'name 5', 3 UNION ALL
SELECT 6, 4 , '6ex', 'name 6', 3
CREATE VIEW [dbo].[View_ParentChild]
AS
-- Use a recursive CTE to build a parent/child heirarchy
WITH
RecursiveCTE AS
(
SELECT
id,
name,
parent_id,
Code,
market,
sort = id
FROM
tbl_codes
WHERE
parent_id IS NULL
UNION ALL
SELECT
tbl_codes.id,
tbl_codes.name,
tbl_codes.parent_id,
tbl_codes.Code,
tbl_codes.market,
sort = tbl_codes.parent_id
FROM
tbl_codes
INNER JOIN RecursiveCTE
ON tbl_codes.parent_id = RecursiveCTE.id
WHERE
tbl_codes.parent_id IS NOT NULL
)
SELECT
Code,
NAME,
Market,
Sort
FROM
RecursiveCTE
GO
По вашему запросу я рефакторинг запрос как VIEW.
Чтобы использовать вид:
SELECT
*
FROM
dbo.View_ParentChild AS vpc
ORDER BY
CASE WHEN (Market = 3) THEN 0
ELSE 1
END,
sort
Это дает следующий результат:
Code NAME Market Sort
---- ------ ------ ----
1ex name 1 3 1
2ex name 2 3 1
3ex name 3 3 1
6ex name 6 3 4
5ex name 5 3 5
4ex name 4 1 4
Чтобы узнать больше о рекурсивных КТР нажмите here
И, как и требовалось, это новая версия вид, который не использует рекурсивный КТЭ
CREATE VIEW [dbo].[View_ParentChild_v2]
AS
SELECT
id,
Code,
market,
sort
FROM
(
SELECT
id,
name,
parent_id,
Code,
market,
sort = id
FROM
tbl_codes
WHERE
parent_id IS NULL
UNION ALL
SELECT
tbl_codes.id,
tbl_codes.name,
tbl_codes.parent_id,
tbl_codes.Code,
tbl_codes.market,
sort = tbl_codes.parent_id
FROM
tbl_codes
WHERE
tbl_codes.parent_id IS NOT NULL
) AS T
GO
Используется следующим образом:
SELECT
*
FROM
View_ParentChild_v2
ORDER BY
CASE WHEN (Market = 3) THEN 0
ELSE 1
END,
sort
NB: первая версия, с помощью рекурсивного ОТВ, может обрабатывать практически неограниченные уровни Parent/Child, а версия 2 обрабатывает только один уровень.
попробуйте это. Выберите код, имя от tbl_codes A где market = 3 order by Id, Parent_id? –