首页 > 解决方案 > 什么是表示多个链接在一起的对象的 SQL Server 数据结构?

问题描述

假设我在 SQL Server 数据库中有两个表:dbo.Companiesdbo.Contracts.

假设我想表示公司和合同之间的一对一关系,以表明合同已授予公司。dbo.Companies我会简单地创建一个带有和的外键的连接表dbo.Contracts

对于任何有经验的 SQL 开发人员来说,上述场景都很容易。

假设我想做类似的事情,但是每家获得合同的公司都可以分包给另一家公司,后者可以进一步分包。

我可能有一家名为“Acme”的公司,它可能分包给“Evil Geniuses”,它可能分包给“Evil on a Budget”。

或者再一次,我“Acme”可能分包给“Evil Geniuses”,后者分包给“Evil on a Budget”,但“Acme”可能同时将同一合同的另一部分分包给“Falling Anvils”。

必须记住,一家公司可能涉及许多不同级别的不同合同,或者系统中可能有一些公司根本没有获得任何合同。

什么样的数据结构可以让我在 SQL 中描述这些关系?

编辑:我正在使用 MS SQL Server。

标签: sqlsql-serverdata-structuresrecursive-datastructures

解决方案


与一对一(或一对多)关系相同就足够了。

SQL 允许递归遍历此类关系。

我没有测试以下查询,但它应该给你一个基本的想法。

WITH RECURSIVE ContractHolders AS (
    SELECT * FROM dbo.Companies AS m 
    JOIN dbo.Contracts AS n ON m.id = n.ContractHolderId
    WHERE m.name = 'Acme'
    UNION ALL
    SELECT m.* FROM ContractHolders AS h
    JOIN dbo.Companies AS m ON m.id = h.ContractRecipientId
    JOIN dbo.Contracts AS n ON m.id = n.ContractHolderId
)
SELECT * FROM ContractHolders;

我猜您使用 Microsoft SQL Server 是基于您对dbo.Read Recursive Queries Using Common Table Expressions的使用以获取更多信息。


推荐阅读