我需要使用 SQL 找到所有记录的根源。下面是表格结构和示例。
客户编号 | 证书号 | OldCertNo | 来源 | 根源 |
---|---|---|---|---|
CU1 | C1 | 数字 | 数字 | |
CU1 | C2 | C1 | 非 | 数字 |
CU1 | C3 | C2 | 非 | 数字 |
超前和滞后将无法提供正确的详细信息,因为对于 1 个用户可以有 3 条记录,对于其他用户可以有 10 条记录。
您可以使用递归 CTE 获取根证书:
WITH data AS (
SELECT *
FROM
(
VALUES (N'CU1', N'C1', N'', N'Digital')
, (N'CU1', N'C2', N'C1', N'NON')
, (N'CU1', N'C3', N'C2', N'NON')
, (N'CU1', N'C4', N'C3', N'Bzz')
) t (CustID,CertNo,OldCertNo,Source)
)
, rootdata AS (
SELECT custid, certno AS root, certno, source, source AS rootsource
FROM data
WHERE oldcertno = '' -- start at the root
UNION ALL
SELECT c.custid, c.certno AS root, c2.certno, c2.source, c.rootsource -- forward original root source cert
FROM rootdata c
INNER JOIN data c2
ON c2.custid = c.custid
AND c2.oldcertno = c.certno -- join on parent cert
)
SELECT *
FROM rootdata
option(maxrecursion 0)
这会将根证书源转发给每个子证书。