如何在 SQL 语句中查找基于参考文档编号的相关记录 ID
How To Find Related Record ID Based Reference Document No on SQL Statement
我需要在同一 table 中显示基于相关记录 ID 的文档编号作为参考。我尝试了很多时间和方向,但无法获得正确的输出。
下面是table和数据:
基本上记录编号2,4和10是根据参考文件编号相关的。例如,如果我select记录编号4我仍然可以列出从第一笔交易到最后一笔交易的所有相关文件。
我希望遇到这个问题的人或任何人都可以从 SQL 语句或 .net 上的编码中找到解决方案,只要我能显示这个结果。
您要link parent 文档上的所有文档吗?如果你想,可以说获取文档并找到 docno XY001 的所有相关文档(假设 XY001 是 parent 文档,否则 link 相反)
你可以使用
SELECT *
FROM TableA AS parentDoc
LEFT OUTER JOIN TableA AS referentialDoc ON parentDoc.docno = referentialDoc.refdocno
WHERE parentDoc.docno = XY001
当然你可以把 WHERE 子句改成
WHERE referentialDoc.docno IS NOT NULL
只显示那些有参考文件的人。
另请注意,这仅适用于 parent - child 的结构。对于 grandparent-parent-child 及更多的结构,您需要扩展查询或以编程方式进行。
我假设您使用的是 postgres,因为这是用它标记的。当您查询给定的文档时,您可以进行递归查询来完成您想要的:
WITH RECURSIVE t AS (
SELECT docno, refdocno
FROM <table>
WHERE docno = 'T0003'
UNION
SELECT blah.docno, blah.refdocno
FROM <table>
JOIN t ON t.docno = blah.refdocno
OR t.refdocno = blah.docno
)
SELECT *
FROM t;
注意:您必须将要搜索的文档放在 with 语句中。如果您需要其他栏目,您也可以将它们放在那里。
PS。我假设第 10 行的 refdocno 在你的例子中应该是 T0003
尝试 Ramfjord 解决方案后,我得到了我想要的结果。我只是添加了一点触摸来排序我的结果,我可以看到从第一笔交易到最后一笔交易,如下所示:
WITH RECURSIVE t AS (
SELECT **recid**, docno, refdocno
FROM <table>
WHERE docno = 'T0003'
UNION
SELECT **c.recid**, docno, refdocno
FROM <table> c
JOIN t ON t.docno = c.refdocno
OR t.refdocno = c.docno
)
SELECT *
FROM t **order by recid**;
Ramfjord 你已经拯救了我!
Spasticmonkey 您的解决方案也适用于亲子 table。我会将您的解决方案用于其他任务。
我需要在同一 table 中显示基于相关记录 ID 的文档编号作为参考。我尝试了很多时间和方向,但无法获得正确的输出。
下面是table和数据:
基本上记录编号2,4和10是根据参考文件编号相关的。例如,如果我select记录编号4我仍然可以列出从第一笔交易到最后一笔交易的所有相关文件。
我希望遇到这个问题的人或任何人都可以从 SQL 语句或 .net 上的编码中找到解决方案,只要我能显示这个结果。
您要link parent 文档上的所有文档吗?如果你想,可以说获取文档并找到 docno XY001 的所有相关文档(假设 XY001 是 parent 文档,否则 link 相反) 你可以使用
SELECT *
FROM TableA AS parentDoc
LEFT OUTER JOIN TableA AS referentialDoc ON parentDoc.docno = referentialDoc.refdocno
WHERE parentDoc.docno = XY001
当然你可以把 WHERE 子句改成
WHERE referentialDoc.docno IS NOT NULL
只显示那些有参考文件的人。
另请注意,这仅适用于 parent - child 的结构。对于 grandparent-parent-child 及更多的结构,您需要扩展查询或以编程方式进行。
我假设您使用的是 postgres,因为这是用它标记的。当您查询给定的文档时,您可以进行递归查询来完成您想要的:
WITH RECURSIVE t AS (
SELECT docno, refdocno
FROM <table>
WHERE docno = 'T0003'
UNION
SELECT blah.docno, blah.refdocno
FROM <table>
JOIN t ON t.docno = blah.refdocno
OR t.refdocno = blah.docno
)
SELECT *
FROM t;
注意:您必须将要搜索的文档放在 with 语句中。如果您需要其他栏目,您也可以将它们放在那里。
PS。我假设第 10 行的 refdocno 在你的例子中应该是 T0003
尝试 Ramfjord 解决方案后,我得到了我想要的结果。我只是添加了一点触摸来排序我的结果,我可以看到从第一笔交易到最后一笔交易,如下所示:
WITH RECURSIVE t AS (
SELECT **recid**, docno, refdocno
FROM <table>
WHERE docno = 'T0003'
UNION
SELECT **c.recid**, docno, refdocno
FROM <table> c
JOIN t ON t.docno = c.refdocno
OR t.refdocno = c.docno
)
SELECT *
FROM t **order by recid**;
Ramfjord 你已经拯救了我!
Spasticmonkey 您的解决方案也适用于亲子 table。我会将您的解决方案用于其他任务。