TerritoryId, Description, ParentTerritoryId, Type
--------------------------------------------------------
1, UnitedStates, null, Territory
1, John Smith, 1, Sales Rep
2, Georgia, 1, Territory
2, Jane Doe, 2, Sales Rep
2, Ann Smith, 2, Sales Rep
如何编写以下T-SQL?假设我正在寻找像“安·史密斯”这样的名字。
我希望结果集看起来像:
1, United States, null, Territory
2, Georgia, 1, Territory
2, Ann Smith, 2, Sales Rep
基本上,我想找到一个销售代表或销售代表,以及他们属于哪个组织。
答案 0 :(得分:2)
假设SQL Server 2005+所以我们可以使用recursive CTE并假设TerritoryId值应该是唯一的:
TerritoryId Description ParentTerritoryId Type
--------------------------------------------------------
1 UnitedStates NULL Territory
2 John Smith 1 Sales Rep
3 Georgia 1 Territory
4 Jane Doe 3 Sales Rep
5 Ann Smith 3 Sales Rep
然后你可以这样做:
WITH cteRecursion AS (
SELECT TerritoryId, Description, ParentTerritoryId, Type, 1 AS Level
FROM YourTable
WHERE Description = 'Ann Smith'
UNION ALL
SELECT t.TerritoryId, t.Description, t.ParentTerritoryId, t.Type, c.Level + 1
FROM YourTable t
INNER JOIN cteRecursion c
ON t.TerritoryId = c.ParentTerritoryId
)
SELECT TerritoryId, Description, ParentTerritoryId, Type
FROM cteRecursion
ORDER BY Level DESC;
答案 1 :(得分:0)
虽然理想情况下可以在表格中使用多级结构,但您可能希望拆分表格。
一张领土表和一张销售代表。
如果您的销售代表可以拥有多个区域,则需要转到3个表格 一个用于销售代表,一个用于区域,另一个用于查找表。
如果您要执行多级表,则需要每个条目都具有唯一ID