我需要在同一个表中显示基于相关记录id的文档no作为参考。我尝试了很多时间和方向,但无法获得正确的输出。
以下是表格和数据:
基本上记录ID没有2,4和10是基于参考文件号相关的。例如,如果我选择记录ID no 4,我仍然可以列出从头到尾交易的所有相关文件。
我希望有人能够解决这个问题,或者任何人有一个SQL语句的解决方案或.net上的编码,只要我能够显示这个结果。
答案 0 :(得分:1)
您是否要链接父文档中的所有文档?如果您愿意,比如获取文档并找到docno XY001的所有相关文档(假设XY001是父文档,否则链接反过来) 你可以用
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
仅显示具有参考文档的那些。
还要注意,这只适用于父子结构。对于祖父母 - 父子的结构等,您需要扩展查询或以编程方式进行。
答案 1 :(得分:1)
我假设你正在使用postgres,因为这是用它标记的。您可以进行递归查询,以便在查询给定docno时完成所需的操作:
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语句中输入您正在搜索的docno。如果您需要其他列,也可以将它们放在那里。
PS。我假设第10行的refdocno在你的例子中应该是T0003
答案 2 :(得分:0)
在尝试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你的解决方案也适合父子表。我会将您的解决方案用于其他任务。