Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Многие ко многим устранение избыточности SELECT  [new]
CloudDBA
Member

Откуда:
Сообщений: 6
Доброго всем,

Есть три таблицы многие ко многим: контакт, атрибут, связка
Нужно вывести каждому контакту его атрибуты:
Использовал такую схему:

select
контакт.ИД,
контакт.Имя,
контакт.Фамилия,
атрибут1.имя,
атрибут2.имя
from
контакт
left join
связка алиас on контакт.ид = алиас.ид
left join
атрибут атрибут1 on алиас.атрибут_ид = атрибут1.атрибут_ид and атрибут1.тип = 1
left join
атрибут атрибут2 on алиас.атрибут_ид = атрибут2.атрибут_ид and атрибут2.тип = 2


Суть в том что получаю почти в 3 раза больше записей (29000 вместо 11610) на выходе чем следует (с одинаковыми ИД), волшебное слово distinct не помогает так еще и от left join не уйдешь, т.к. не всем контактам есть тот или иной атрибут.

Кто знает как сделать человеческий запрос?

З.Ы. Таблицы приведены просто для логики =)
13 дек 11, 13:42    [11756104]     Ответить | Цитировать Сообщить модератору
 Re: Многие ко многим устранение избыточности SELECT  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
Рекомендации
Если Ваш вопроc связан с созданием какого-то запроса,
то предоставление Вами следующих материалов может существенно ускорить нахождение решения:
- скрипты создания таблиц;
- скрипты заполнения этих таблиц тестовыми данными;
- описание желаемого результата на примере тестовых данных.
13 дек 11, 13:45    [11756134]     Ответить | Цитировать Сообщить модератору
 Re: Многие ко многим устранение избыточности SELECT  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
CloudDBA,

а какие из всех возможных пар (атрибут1.имя, атрибут2.имя) надо оставить?
Можно пронумеровать строки атрибут1 и атрибут2 для одного и того же алиас.атрибут_ид,
после чего в условия связки добавить равенство порядковых номеров.
Будет ли это то, чего Вы хотите?
13 дек 11, 14:28    [11756617]     Ответить | Цитировать Сообщить модератору
 Re: Многие ко многим устранение избыточности SELECT  [new]
Klick
Member

Откуда: Стерлитамак - Москва
Сообщений: 1023
Можно функцию сделать которая вернет значение атрибута по ID контакта и типу атрибутаи уже с ней возякаться.
13 дек 11, 15:08    [11757061]     Ответить | Цитировать Сообщить модератору
 Re: Многие ко многим устранение избыточности SELECT  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31960
CloudDBA
Нужно вывести каждому контакту его атрибуты:
Задача непонятна.

Нужно вывести по одному атрибуту каждого типа для каждого контакта или все атрибуты? Ваш запрос делает второе, и понятно, что контакт в рекордсете будет неуникальный.
13 дек 11, 16:28    [11757947]     Ответить | Цитировать Сообщить модератору
 Re: Многие ко многим устранение избыточности SELECT  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
пусть ваше клиентское приложение юзает "человеческий" грид , который не дублирует контакты
а запрос можете свой оставить
13 дек 11, 16:30    [11757970]     Ответить | Цитировать Сообщить модератору
 Re: Многие ко многим устранение избыточности SELECT  [new]
ura
Member [заблокирован]

Откуда: Киев
Сообщений: 932
select
контакт.ИД,
контакт.Имя,
контакт.Фамилия,
max(case when атрибут1.тип = 1 then атрибут1.имя end) as атрибут1,
max(case when атрибут1.тип = 2 then атрибут1.имя end) as атрибут2
from 
контакт
left join
связка алиас on контакт.ид = алиас.ид
left join
атрибут атрибут1 on алиас.атрибут_ид = атрибут1.атрибут_ид
group by контакт.ИД,
контакт.Имя,
контакт.Фамилия


ну или так, в зависимости от данных

select
контакт.ИД,
контакт.Имя,
контакт.Фамилия,
атрибут1.имя,
атрибут2.имя
from
контакт
left join (связка алиас1 join атрибут атрибут1 on алиас1.ид=атрибут1.ид) on атрибут1.тип = 1 and контакт.ид = алиас1.ид
left join (связка алиас2 join атрибут атрибут2 on алиас2.ид=атрибут2.ид) on атрибут2.тип = 2 and контакт.ид = алиас2.ид
13 дек 11, 18:19    [11759085]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить