【问题标题】:Creating a linked ID创建链接 ID
【发布时间】: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被分成三个R028636R028637R028638

我尝试过很多这样的变化:

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


【解决方案1】:

这个问题没有什么可怕的,一旦你跳进去,让自己在手机上打字太多,就会给自己腕管。这只是一个稍微修改的标准递归分层查询问题。需要注意的是,递归中的加入条件是当前帐号是某个父母的子帐户。至于编号,我们只是在顶级父级上使用DENSE_RANK

WITH cte AS (
    SELECT m.*, DENSE_RANK() OVER (ORDER BY m.Account_Number) AS pos
    FROM temptable m
    WHERE Parent_Account IS NULL
    UNION ALL
    SELECT m.*, cte.pos
    FROM temptable m
    INNER JOIN cte
        ON m.Account_Number = cte.Child_Account
)

SELECT *
FROM cte
ORDER BY pos;

Demo

注意:我非常感谢这里出色的接受答案,written by @Quassnoi

【讨论】:

  • 谢谢,只是说明还有多少关于 sql 的知识。
  • @ScottCraner 这些问题在 Stack Overflow 上并不经常出现,因此您需要一段时间才能得到答案。
猜你喜欢
  • 2021-12-23
  • 1970-01-01
  • 2015-06-09
  • 2021-12-17
  • 1970-01-01
  • 2011-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多