【发布时间】:2016-08-18 16:23:52
【问题描述】:
我有两个SQL Server 表:
- 发票 (
invoice) - 发票关系 (
invoice_relation)
invoice 表存储所有带有交易对账单的发票记录。
invoice_relation 表存储发票之间的任何关系。
这是发票如何相互关联的示例:
所以目标是在给定invoicenumber 和folio 的invoice 表下找到“folio”,但folio 有时不会是invoice 所具有的folio ,所以我需要对所有树关系进行搜索,以查找是否有任何发票与发票编号匹配,而且 folio 是关系的一部分。
例如,我必须找到对开并匹配以下发票编号:
- 对开页:1003
- 发票编号:A1122
在我的查询中,我需要先按 folio 查找,因为它是我的 invoice 表主键。然后,将尝试将A1122 与不匹配的D1122 匹配,因此我必须搜索所有树结构以查找是否有A1122。结果将是发票 A1122 在文件夹 1000 中找到。
关于如何做到这一点的任何线索?
以下是如何使用数据创建上述示例表的脚本:
CREATE TABLE [dbo].[invoice](
[folio] [int] NOT NULL,
[invoicenumber] [nvarchar](20) NOT NULL,
[isactive] [bit] NOT NULL,
CONSTRAINT [PK_invoice] PRIMARY KEY CLUSTERED
(
[folio] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[invoice_relation](
[relationid] [int] NOT NULL,
[invoice] [nvarchar](20) NOT NULL,
[parentinvoice] [nvarchar](20) NOT NULL,
CONSTRAINT [PK_invoice_relation_1] PRIMARY KEY CLUSTERED
(
[relationid] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
INSERT [dbo].[invoice] ([folio], [invoicenumber], [isactive]) VALUES (1000, N'A1122', 1)
GO
INSERT [dbo].[invoice] ([folio], [invoicenumber], [isactive]) VALUES (1001, N'B1122', 1)
GO
INSERT [dbo].[invoice] ([folio], [invoicenumber], [isactive]) VALUES (1002, N'C1122', 1)
GO
INSERT [dbo].[invoice] ([folio], [invoicenumber], [isactive]) VALUES (1003, N'D1122', 1)
GO
INSERT [dbo].[invoice] ([folio], [invoicenumber], [isactive]) VALUES (1004, N'F1122', 1)
GO
INSERT [dbo].[invoice] ([folio], [invoicenumber], [isactive]) VALUES (1005, N'G1122', 1)
GO
INSERT [dbo].[invoice_relation] ([relationid], [invoice], [parentinvoice]) VALUES (1, N'A1122', N'B1122')
GO
INSERT [dbo].[invoice_relation] ([relationid], [invoice], [parentinvoice]) VALUES (2, N'C1122', N'A1122')
GO
INSERT [dbo].[invoice_relation] ([relationid], [invoice], [parentinvoice]) VALUES (3, N'D1122', N'A1122')
GO
INSERT [dbo].[invoice_relation] ([relationid], [invoice], [parentinvoice]) VALUES (4, N'F1122', N'B1122')
GO
INSERT [dbo].[invoice_relation] ([relationid], [invoice], [parentinvoice]) VALUES (5, N'G1122', N'F1122')
GO
【问题讨论】:
-
您可以将示例输出粘贴为文本
-
我同意样本输出和输入会很好,因为我对您的叙述有点迷茫:“我必须找到对开页并匹配发票编号”哪个对开页最上面的父项?孙子????
-
通常为了递归,还有一种方法可以识别最顶层的父母或最底层的孩子。我没有看到在您的表格示例中是否有一种方法可以识别它,或者递归是否必须假设起始值可能在某个地方的中间?
-
马特可能在中间的某个地方。
标签: sql sql-server