2017-09-18 5 views
0

아내/남편과 자녀를 연결하는 표가 원본 데이터베이스에 있습니다 (있는 경우).가족 관계 테이블에 패밀리 ID 열을 추가하십시오.

자녀와의 관계는 아내 또는 남편을 통과 할 수 있지만 성인과 어린이 사이에는 관계가 있으며 남편과 아내는 단 한 가지 관계 만 있습니다. 자녀/자녀에게 배우자와 관계가있는 사람은 반드시 동일한 성인이 아닙니다.

각 사람과 가족의 고유 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 명 (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 | 
+----------+----------+ 
+0

Y 우리의 샘플 데이터는 많은 의미를 갖습니다. 존재하지 않는 ToID 값이 있습니다.아마 당신은 당신이 게시 해야하는지에 대한 좋은 아이디어를 위해이 기사를 살펴볼 필요가 있습니다. http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ –

+0

테이블 및 데이터를 텍스트로 게시 [이 기사 읽기] (http : /meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images-of-code-on-so-wing-asking-a-question/285557#285557) –

+0

테이블이 있습니까' 사람? 재귀 쿼리를 사용해 보셨습니까? –

답변

0

이 결과를 달성하는 또 다른 방법이다

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 
0

먼저 각 가족의 남편을 찾고 할당해야합니다. 당신은 ID가 [FromID]

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 

출력으로 표시되지 찾아

enter image description here

그럼 그냥 그 모든 가족 구성원을 [얻기 위해 재귀 쿼리를 사용하여 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 

출력

여기

enter image description here