Вопрос рекурсивного запроса - разбить строки на столбцы? - PullRequest
2 голосов
/ 27 мая 2010

У меня есть таблица "Семьи", вот так

FamilyID    PersonID    Relationship
-----------------------------------------------
F001        P001        Son
F001        P002        Daughter
F001        P003        Father
F001        P004        Mother
F002        P005        Daughter
F002        P006        Mother
F003        P007        Son
F003        P008        Mother

и мне нужен вывод как

FamilyID    PersonID    Father  Mother
-------------------------------------------------
F001        P001        P003    P004
F001        P002        P003    P004
F001        P003        
F001        P004        
F002        P005                P006
F002        P006        
F003        P007                P008
F003        P008        

, в котором PersonID Отца и Матери для данного PersonID перечислены (если применимо) в отдельных столбцах. Я знаю, что это должен быть относительно тривиальный запрос для написания (и, следовательно, для нахождения инструкций), но я не могу найти правильные условия поиска. Поиск «рекурсивных запросов SQL» мне ближе всего понравился, но я не могу полностью перевести эти методы в то, что я пытаюсь сделать здесь.

Я пытаюсь учиться, поэтому приветствуются несколько методов, а также словарный запас, который я должен прочитать. Спасибо!

Ответы [ 2 ]

2 голосов
/ 27 мая 2010

Вы можете самостоятельно присоединиться к таблице дважды с помощью внешних объединений, чтобы получить то, что вы хотите:

SELECT
    T1.FamilyID AS FamilyID,
    T1.PersonID AS PersonID,
    T2.PersonID AS Father,
    T3.PersonID AS Mother
FROM Families T1
LEFT JOIN Families T2
    ON T1.FamilyID = T2.FamilyID
   AND T1.Relationship IN ('Son', 'Daughter')
   AND T2.Relationship = 'Father'
LEFT JOIN Families T3
    ON T1.FamilyID = T3.FamilyID
   AND T1.Relationship IN ('Son', 'Daughter')
   AND T3.Relationship = 'Mother'

Результат:

FamilyID  PersonID  Father  Mother  
F001      P001      P003    P004    
F001      P002      P003    P004    
F001      P003      NULL    NULL    
F001      P004      NULL    NULL    
F002      P005      NULL    P006    
F002      P006      NULL    NULL    
F003      P007      NULL    P008    
F003      P008      NULL    NULL    
0 голосов
/ 27 мая 2010

В SQL Server для решения рекурсивных проблем используются следующие функции: Распространенные табличные выражения .

...