如何在SQL语句中查找基于引用文档编号的相关记录ID
我需要在同一个表中显示相关的基于记录id的文档编号作为参考。我尝试了很多时间和方向,但无法获得正确的输出 下表和数据如下: 基本上,记录ID号2、4和10是基于参考文档号关联的。例如,如果我选择记录ID号4,我仍然可以列出从第一笔交易到最后一笔交易的所有相关文档如何在SQL语句中查找基于引用文档编号的相关记录ID,sql,.net,postgresql,relationship,Sql,.net,Postgresql,Relationship,我需要在同一个表中显示相关的基于记录id的文档编号作为参考。我尝试了很多时间和方向,但无法获得正确的输出 下表和数据如下: 基本上,记录ID号2、4和10是基于参考文档号关联的。例如,如果我选择记录ID号4,我仍然可以列出从第一笔交易到最后一笔交易的所有相关文档 我希望有人能解决这个问题,或者任何人都能从SQL语句或.net编码中找到解决方案,只要我能显示这个结果。是否要链接父文档上的所有文档?如果您想要,假设XY001是父文档,那么就说获取一个文档并查找docno XY001的所有相关文档,
我希望有人能解决这个问题,或者任何人都能从SQL语句或.net编码中找到解决方案,只要我能显示这个结果。是否要链接父文档上的所有文档?如果您想要,假设XY001是父文档,那么就说获取一个文档并查找docno 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
仅显示具有引用文档的文档
还要注意,这只适用于父-子结构。对于祖父母子女的结构等,您需要展开查询或以编程方式进行查询。是否要链接父文档上的所有文档?如果您想要,假设XY001是父文档,那么就说获取一个文档并查找docno 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
仅显示具有引用文档的文档
还要注意,这只适用于父-子结构。对于祖父母子女的结构等,您需要展开查询或以编程方式进行查询。我假设您使用的是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语句中输入要搜索的文档号。如果您需要其他列,也可以将它们放在那里
另外,我假设在您的示例中,第10行的refdocno应该是T0003我假设您使用的是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语句中输入要搜索的文档号。如果您需要其他列,也可以将它们放在那里
另外,我假设在您的示例中,第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解决方案后,我得到了我想要的结果。我只需添加一点触控即可对结果进行排序,这样我就可以看到从第一笔到最后一笔交易,如下所示:
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告诉我应该做什么,并向你们两位学习。我想把我的标题改为如何在同一个表中找到基于记录ID的参考文档号。也许在这之后。另外,我假设第10行的refdocno应该是T0003,在你的例子中,你是正确的拉姆峡湾,我在图片上的错误,我附上。很抱歉我会尝试两种解决方案,从你的家伙,让你知道结果。无论如何,感谢您抽出时间展示解决方案和解释。非常感谢你们。你好,非常感谢你们告诉我我应该做什么,并向你们两位学习。我想把我的标题改为如何在同一个表中找到基于记录ID的参考文档号。也许在这之后。另外,我假设第10行的refdocno应该是T0003,在你的例子中,你是正确的拉姆峡湾,我在图片上的错误,我附上。很抱歉我会尝试两种解决方案,从你的家伙,让你知道结果。无论如何,感谢您抽出时间展示解决方案和解释。非常感谢你。