【发布时间】:2018-11-04 23:50:35
【问题描述】:
我有下表:
Account_Number Parent_Account Child_Account
R003247 R000355 R000002
R000355 NULL R003247
R000002 R003247 NULL
R004853 NULL R028636
R004853 NULL R028638
R004853 NULL R028637
R028636 R004853 NULL
R028638 R004853 NULL
R028637 R004853 NULL
可以加载的:
create table dbo.temptable
(Account_Number varchar(10),
Parent_Account varchar(10),
Child_Account varchar(10))
insert into dbo.temptable
values
('R003247','R000355','R000002'),
('R000355',NULL,'R003247'),
('R000002','R003247',NULL),
('R004853',NULL,'R028636'),
('R004853',NULL,'R028638'),
('R004853',NULL,'R028637'),
('R028636','R004853',NULL),
('R028638','R004853',NULL),
('R028637','R004853',NULL)
此表表示帐号的拆分和重新分配。它与跟踪地块的分割和组合有关。
如上表所示,前三行应该组合在一起,因为它来自R000355 --> R003247 --> R000002
最后6个,如上表所示,也应该分组,因为它显示R004853被分成三个R028636,R028637,R028638。
我尝试过很多这样的变化:
SELECT CE.*,TT.ID
FROM dbo.temptable CE
INNER JOIN
(
SELECT ACCOUNT_NUMBER,ROW_NUMBER() OVER (ORDER BY ACCOUNT_NUMBER) AS ID
FROM(
SELECT DISTINCT ACCOUNT_NUMBER FROM dbo.temptable where Child_Account is not null)AA
)TT
ON TT.ACCOUNT_NUMBER = CE.Account_Number OR TT.Account_Number = CE.Child_Account
哪个屈服了:
Account_Number Parent_Account Child_Account ID
R000355 NULL R003247 1
R003247 R000355 R000002 2
R000355 NULL R003247 2
R004853 NULL R028636 3
R004853 NULL R028638 3
R004853 NULL R028637 3
当我真正需要的是:
Account_Number Parent_Account Child_Account ID
R000355 NULL R003247 1
R003247 R000355 R000002 1
R000002 R003247 NULL 1
R004853 NULL R028636 2
R004853 NULL R028638 2
R004853 NULL R028637 2
R028636 R004853 NULL 2
R028638 R004853 NULL 2
R028637 R004853 NULL 2
【问题讨论】:
-
The first three lines...除非您提供生成此订单的ORDER BY子句,否则这是没有意义的。 SQL 表与 Excel 中的表有点不同。 -
@TimBiegeleisen 我添加了
as shown in the table above这足以让读者知道我指的是问题中发布的表格吗? -
这很棘手,我可以通过您的预期输出 +1 弄清楚您想要什么。您需要递归分层查询。我不知道该怎么做:-(
-
可能会在这里找到一些有用的东西:stackoverflow.com/questions/18618999/…
-
你的桌子让我摸不着头脑。有一行说明孩子,另一行说明父母,这是多余的。您在这里苦苦挣扎的主要原因是因为数据结构没有达到应有的规范化程度。你有一个多对多的关系,都挤在一个表中。
标签: sql-server