Извлечение уникальных пар из таблицы, содержащей взаимные отношения - PullRequest
0 голосов
/ 03 июня 2009

Рассмотрим SQL Server 2005 базу данных с кучей данных о множестве людей, большая часть которых замужем . Для отслеживания отношений между людьми существует таблица Отношения , которая служит для связи идентификатора одного человека с идентификатором другого. A Тип отношений в каждой записи Отношения служит для обозначения типа отношений, существующих между двумя людьми, о которых идет речь (дух): "женат", "является сыном", "является дочерью" и т. Д. .

Для женатых людей в таблице есть ДВА записи о взаимоотношениях: одна показывает, что Лицо-А состоит в браке с Лицом-В, а другая - о том, что Лицо-В состоит в браке с Лицом-А. В случае брака было бы ошибкой не иметь обе записи, хотя в БД есть несколько записей без взаимности. (Это унаследованный дизайн, и у меня нет свободы менять этот подход.)

RelID  Person1  Person2  RelationshipType
-----------------------------------------
1      1001     1010     Married           //Reciprocated by RelID 4
2      1002     1011     Married           //Reciprocated by RelID 5
3      1003     1012     Married           //Reciprocated by RelID 6
4      1010     1001     Married           //Reciprocated by RelID 1
5      1011     1002     Married           //Reciprocated by RelID 2
6      1012     1003     Married           //Reciprocated by RelID 3
7      1004     1013     Married           //Not properly reciprocated

Что мне нужно сделать, так это извлечь из таблицы уникальных супружеских пар.

Я создал функцию с именем GetOrderedPair (val1, val2) , которая принимает 2 идентификатора человека и возвращает разделенное запятыми строковое значение обоих значений в последовательном порядке. Таким образом, он всегда возвращает одно и то же строковое значение независимо от того, получаю ли я, ссылаясь на приведенный выше пример данных, Person1 и Person2 из записи с RelID 1 или RelID 4 (возвратно-поступательная пара записей).

Я не могу не думать, что есть лучший способ ускользнуть от меня. Является ли использование этой функции лучшим подходом? Что еще можно порекомендовать?

Спасибо, конечно, заранее. : -)

Ответы [ 2 ]

6 голосов
/ 03 июня 2009

Поскольку вы инкапсулировали GetOrderPair, я понятия не имею, какая логика стоит за ним, но я по крайней мере дам вам то, что я делаю:

select distinct
    case when Person1 > Person2 then Person2 else Person1 end as Person1,
    case when Person1 > Person2 then Person1 else Person2 end as Person2
from
    couples
where
    relationshiptype = 'Married'

Может быть, у кого-то есть лучший способ сделать это, чем у меня.

1 голос
/ 03 июня 2009

Если честно, я не совсем понимаю, в чем ваш вопрос. Обычно, чтобы получить список супружеских пар, вы должны сделать простой запрос, подобный этому:

SELECT p1.*, p2.*
FROM   Person AS p1
JOIN   Relationship r ON p1.PersonID = r.Person1 AND r.RelationshipType = 'Married'
JOIN   Person AS p2 ON r.Person2 = p2.PersonID
WHERE  p1.PersonID < p2.PersonID  --This would ensure that you only get each couple "once"

Это то, что вы ищете?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...