Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 DISTINCT по нескольким полям...  [new]
asd10
Guest
Всем привет!
Глупый вопрос
Есть выборка типа
t1.ID, t2.Name1, t2.Name2, t3.Value

Так вот t1 и t3 джойнится left join и есть условие по t3
Соответственно нужно выбрать DISTINCT (t1.ID), но сохраняя при этом t2.Name1, t2.Name2
7 фев 18, 11:23    [21172458]     Ответить | Цитировать Сообщить модератору
 Re: DISTINCT по нескольким полям...  [new]
aleksrov
Member

Откуда:
Сообщений: 948
asd10,

Ниче не понял. А теперь нормально и с примером, что есть, а что надо.
7 фев 18, 11:29    [21172485]     Ответить | Цитировать Сообщить модератору
 Re: DISTINCT по нескольким полям...  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
asd10,

пронумеровать ROW_NUMBER() OVER (PARTITION BY t1.Id) и взять первые
7 фев 18, 11:33    [21172503]     Ответить | Цитировать Сообщить модератору
 Re: DISTINCT по нескольким полям...  [new]
asd10
Guest
Суть:
Table1 t1 - основная таблица с записями
Table2 t2 - справочник из которого нужно взять определенное имя
Table3 t3 - таблица атрибутов (может быть несколько атрибутов структура: ObjectID, AttributeID, Value )
Нужно выбрать все записи t1, с именем из t2 для которых не существует атрибута AttributeID=1 в t3, либо значение атрибута c AttributeID=1 не равно 'а' и не равно 'b'

Пока есть:
select * from
(select t1.ID, t3.* from Table1 t1
inner join Table2 t2 on t1.AnyID = t2.AnyID
left join Table3 t3  on t3.ObjectID = t1.ID
where t1.Brief like 'abc%'    
) ttt 
where AttributeID IS NULL
 or  ((AttributeID=1) and (Value<>'a') and (Value<>'b'))
 or ((AttributeID<>1) and not exists (select * from Table3 where ObjectID=ID and (AttributeID=1) and ((Value='a') or (Value='b'))))
7 фев 18, 11:48    [21172551]     Ответить | Цитировать Сообщить модератору
 Re: DISTINCT по нескольким полям...  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 289
asd10,
1.Тебе не нужно тянуть значения Table3 (вычеркиваем "left join Table3 t3") - достаточно проверить наличие определенных записей.
2.Условие "для которых не существует атрибута AttributeID=1 в t3, либо значение атрибута c AttributeID=1 не равно 'а' и не равно 'b'" упрощается до вида "для которых не существует атрибута AttributeID=1 в t3 со значениями равными 'а' или 'b'":
select t1.ID, t2.* from Table1 t1
inner join Table2 t2 on t1.AnyID = t2.AnyID
where t2.Brief like 'abc%'    
and not exists (select 1 from Table3 t3 where t3.ObjectID=t1.ID and t3.AttributeID=1 and t3.Value in ('a','b'))
7 фев 18, 12:03    [21172617]     Ответить | Цитировать Сообщить модератору
 Re: DISTINCT по нескольким полям...  [new]
asd10
Guest
Kopelly, спасибо!
Тормознул с условием и правда ))
Но всё-равно остались не уникальные по t1.ID записи.
Там ещё один джоин добавился у меня.
Сделал просто GroupBY t1.ID, t2.Name1, t2.Name2
по всем нужным для вывода полям.
Надеюсь это правильно.
8 фев 18, 14:49    [21176507]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить