【问题标题】:add Family ID Column on Family Relations Table在家庭关系表上添加家庭 ID 列
【发布时间】:2017-09-18 20:00:21
【问题描述】:

我的源数据库中有一个表,该表将一个人与他的妻子/丈夫和他们的孩子(如果他们有的话)联系起来。

与孩子的关系可以通过妻子或丈夫,但只有一个成年人与孩子的关系,夫妻之间只有一种关系。与配偶的关系与与子女的关系不一定是同一个成年人。

我想创建一个输出,其中包含每个人和他们家庭的唯一 ID。但我似乎无法理解如何获得结果。

下面是我的源数据示例。

+--------+------+
| FromID | ToID |
+--------+------+
|      1 |    2 |
|      2 |    3 |
|      2 |    4 |
|      5 |    6 |
|      6 |    7 |
|      8 |    9 |
+--------+------+

   CREATE TABLE [dbo].[Relations](
            [FromID] [int] NULL,
            [ToID] [int] NULL
        ) 
        INSERT [dbo].[Relations] ([FromID], [ToID]) VALUES (1, 2)
        INSERT [dbo].[Relations] ([FromID], [ToID]) VALUES (2, 3)
        INSERT [dbo].[Relations] ([FromID], [ToID]) VALUES (2, 4)
        INSERT [dbo].[Relations] ([FromID], [ToID]) VALUES (5, 6)
        INSERT [dbo].[Relations] ([FromID], [ToID]) VALUES (6, 7)
        INSERT [dbo].[Relations] ([FromID], [ToID]) VALUES (8, 9)

在此示例数据中:

  • 第 1 个人与第 2 个人结婚,第 2 个人有 2 个孩子 (3,4)(4 口之家)
  • 第 5 个人与第 6 个人结婚,第 6 个人有 1 个孩子 (7)(3 口之家)
  • 第 8 个人与第 9 个人结婚,没有孩子(2 口之家)

下面是想要的结果:

+----------+----------+
| PersonID | FamilyID |
+----------+----------+
|        1 |        1 |
|        2 |        1 |
|        3 |        1 |
|        4 |        1 |
|        5 |        2 |
|        6 |        2 |
|        7 |        2 |
|        8 |        3 |
|        9 |        3 |
+----------+----------+

【问题讨论】:

  • 您的示例数据确实很有意义。您在 ToID 中有不存在的值。也许您需要查看这篇文章,以了解有关您应该发布的内容的一些好主意。 spaghettidba.com/2015/04/24/…
  • 以文本形式发布表格和数据READ THIS
  • 你有桌子Persons吗?你试过递归查询吗?
  • 是否有任何 SQL 尝试显示您的努力?
  • 你还需要确定你想去多少关系。由于您没有记录关系类型,因此您将无法确定配偶与子女。

标签: sql sql-server tsql parent-child recursive-query


【解决方案1】:

这是实现此结果的另一种方法:

SELECT DISTINCT
  COALESCE(h.husband, d.dependents) AS id,
  COALESCE(d.familyid, h.familyid) AS familyid
FROM (SELECT
            r.ToID AS dependents,
            DENSE_RANK() OVER (ORDER BY COALESCE(r2.Fromid, r.Fromid)) AS familyid
      FROM Relations r
      LEFT JOIN Relations r2
        ON r.[FromID] = r2.ToID) d
FULL JOIN (SELECT
              COALESCE(r2.Fromid, r.Fromid) AS husband,
              DENSE_RANK() OVER (ORDER BY COALESCE(r2.Fromid, r.Fromid)) AS familyid
           FROM Relations r
           LEFT JOIN Relations r2
             ON r.[FromID] = r2.ToID) h
  ON d.dependents = h.husband

【讨论】:

    【解决方案2】:

    首先你需要找出每个家庭的丈夫并分配和ID。您查找未显示为[FromID]的ID

    SQL DEMO

    WITH husband as (      
        SELECT R1.[FromID] as [ID],
               ROW_NUMBER() OVER (ORDER BY R1.[FromID]) as rn
        FROM [Relations] R1
        LEFT JOIN [Relations] R2
          ON R1.[FromID] = R2.[ToID]
        WHERE R2.[FromID] IS NULL
    )
    SELECT *
    FROM husband
    

    输出

    然后只需使用递归查询来获取该 [ID] 的所有家庭成员

    https://technet.microsoft.com/en-us/library/ms186243(v=sql.105).aspx

    编辑:

    因为你的树只有两层深度,你可以使用JOINS 来完成,但如果你想处理单亲家庭,我可以看到问题。

    SQL DEMO

    WITH husbands as (      
        SELECT  ROW_NUMBER() OVER (ORDER BY R1.[FromID]) as [familyID],
                R1.[FromID] as [ID]           
        FROM [Relations] R1
        LEFT JOIN [Relations] R2
          ON R1.[FromID] = R2.[ToID]
        WHERE R2.[FromID] IS NULL
    ), wifes as (
        SELECT H.[familyID], R1.[ToID] as [ID]
        FROM husbands H
        JOIN Relations R1
          ON H.[ID] = R1.[FromID] 
    ), childrens as (
        SELECT H.[familyID], R2.[ToID] as [ID]
        FROM husbands H
        JOIN Relations R1
          ON H.[ID] = R1.[FromID] 
        JOIN Relations R2
          ON R1.[ToID] = R2.[FromID]     
    )    
    SELECT * FROM husbands UNION 
    SELECT * FROM wifes UNION 
    SELECT * FROM childrens
    

    输出

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 2012-10-23
      • 1970-01-01
      • 1970-01-01
      • 2016-12-26
      相关资源
      最近更新 更多