Select Distinct with text field problem in SQL Server

User avatar
Sabina
Уже с Приветом
Posts: 5669
Joined: 13 Oct 2000 09:01
Location: East Bay, CA

Post by Sabina »

Vik_NJ wrote:Скорее всего работать не будет, но может попробовать добавить к Вашему selectу
union
SELECT ID1, Description from table1 where 1=2
( union тоже дублирующие записи должен убирать ) :D


UNION может дать ту же ошибку
http://www.experts-exchange.com/Databases/Microsoft_SQL_Server/Q_20829157.html

Q:
SELECT * FROM vw_performance_evenement_1
UNION
SELECT * FROM vw_performance_evenement_2

gives this error:
"The text, ntext, or image data type cannot be selected as DISTINCT."
But each of the separate queries don't give any problem.
There isn't any use of "DISTINCT" in the views used.

A:
A little bit of explaination now :

select 1 union select 2

is the same than

select distinct * from (select1 union all select2)

Note :
union and union all are not equivalent

if the two querie's results are not logically exclusive (ie if their intersection is not null), you migth get duplicate records
Sergey___K
Уже с Приветом
Posts: 13014
Joined: 10 Jul 2001 09:01
Location: VA

Post by Sergey___K »

Сделайте GROUP BY по тому, что DISTINCT и JOIN это по тому же самому "в туда", где TEXT.
User avatar
Strannik223
Уже с Приветом
Posts: 569
Joined: 14 Dec 2003 04:06
Location: Львов->Киев->Торонто

Post by Strannik223 »

Вообще то принято в вопросах по сиквелу полные DDL приводить. Я например не могу понять что в приведеной задаче нужно DISTINCT-ить. Desription?
Никакой разрухи нет. (с) Проф. Преображенский.
User avatar
AnyaGal
Уже с Приветом
Posts: 5771
Joined: 02 Dec 1999 10:01
Location: Saint-Petersburg --> Bellevue, WA

Post by AnyaGal »

Distinct надо по Table1.ID1, но к нему нужно много других полей прицепить из табле1, в том числе и Description.

Я всмотрелась в свою же первую вчерашнюю попытку, которая не работала (аналог того, что SBolgov предложил с самого начала - со вторым IN), нашла там ошибку, исправила, вроде работает.


С Group By попробовала сегодня, но с налету не получилось, не нравится какое-то поле, может я там тоже ошиблась в чем-то или не так поняла.

Ладно буду дальше тестировать. :)
Спасибо
User avatar
AnyaGal
Уже с Приветом
Posts: 5771
Joined: 02 Dec 1999 10:01
Location: Saint-Petersburg --> Bellevue, WA

Post by AnyaGal »

То бишь сейчас что-то типа:

Code: Select all

SELECT ID1, ID2 
FROM Table1
WHERE ID1 IN
(SELECT DISTINCT Table1.ID1
FROM Table1 INNER JOIN Table3
ON Table1.ID1=Table3.ID1
WHERE Table3.ID2 IN (1,2))
User avatar
Strannik223
Уже с Приветом
Posts: 569
Joined: 14 Dec 2003 04:06
Location: Львов->Киев->Торонто

Post by Strannik223 »

Code: Select all

select
  (select top 1 Description from Table1 where ID=t1.ID) as Description
from (select distinct ID from Table1) t1
join....
join....
join....


Не уверен что можно это сделать с group by, потому что ни одна функция агрегации не сработает по текстовому полю.
Никакой разрухи нет. (с) Проф. Преображенский.
User avatar
AnyaGal
Уже с Приветом
Posts: 5771
Joined: 02 Dec 1999 10:01
Location: Saint-Petersburg --> Bellevue, WA

Post by AnyaGal »

SBolgov wrote:

Code: Select all

SELECT
  ID1,
  Description
FROM
  Table1
WHERE
  ID1 IN (Select ID1 FROM Table3 WHERE ID2 IN (1,2))


Во это наверное лучше, только во второй select Distinct хорошо бы добавить. :roll:

А в моем варианте кажись Inner Join в IN лишняя, но вроде как работает. :roll:
User avatar
Strannik223
Уже с Приветом
Posts: 569
Joined: 14 Dec 2003 04:06
Location: Львов->Киев->Торонто

Post by Strannik223 »

AnyaGal wrote:То бишь сейчас что-то типа:

Code: Select all

SELECT ID1, ID2 
FROM Table1
WHERE ID1 IN
(SELECT DISTINCT Table1.ID1
FROM Table1 INNER JOIN Table3
ON Table1.ID1=Table3.ID1
WHERE Table3.ID2 IN (1,2))


1. ID2 к какой таблице относится??? Рекомендую всегда использовать aliases.
2. Если подзапрос вернет ID={1}, то при "WHERE ID1 IN" получишь 2 записи, у которых ID=1, разве нет? И какой же это distinct?
Никакой разрухи нет. (с) Проф. Преображенский.
User avatar
AnyaGal
Уже с Приветом
Posts: 5771
Joined: 02 Dec 1999 10:01
Location: Saint-Petersburg --> Bellevue, WA

Post by AnyaGal »

Code: Select all

SELECT 
  ID1,
  Description
FROM
  Table1
WHERE
  ID1 IN (Select Distinct ID1 FROM Table3 WHERE ID2 IN (1,2))


Во так тоже работает и это по-моему пока самое простое решение :)
User avatar
Strannik223
Уже с Приветом
Posts: 569
Joined: 14 Dec 2003 04:06
Location: Львов->Киев->Торонто

Post by Strannik223 »

SBolgov wrote:
Sabina wrote:Так тут тот же SELECT DISTINCT для текст поля Table1.Description ..
Или я чего-то недопонимаю?

Пардон, опечатка. :oops: Уже исправил.

Разумеется, DISTINCT должен быть только во внутреннем SELECT, а не во внешнем.

Сабина, спасибо! ;)


Ну а толку делать внутренний distinct если при join Table1 дублированые записи опять расплодятся.
IMHO не катит
Никакой разрухи нет. (с) Проф. Преображенский.
User avatar
AnyaGal
Уже с Приветом
Posts: 5771
Joined: 02 Dec 1999 10:01
Location: Saint-Petersburg --> Bellevue, WA

Post by AnyaGal »

Strannik223 wrote:
AnyaGal wrote:То бишь сейчас что-то типа:

Code: Select all

SELECT ID1, ID2
FROM Table1
WHERE ID1 IN
(SELECT DISTINCT Table1.ID1
FROM Table1 INNER JOIN Table3
ON Table1.ID1=Table3.ID1
WHERE Table3.ID2 IN (1,2))


1. ID2 к какой таблице относится??? Рекомендую всегда использовать aliases.
2. Если подзапрос вернет ID={1}, то при "WHERE ID1 IN" получишь 2 записи, у которых ID=1, разве нет? И какой же это distinct?


Там я ID2 по ошибке указала, там должно быть Description конечно. В следующем моем посте уже правильно.
User avatar
Strannik223
Уже с Приветом
Posts: 569
Joined: 14 Dec 2003 04:06
Location: Львов->Киев->Торонто

Post by Strannik223 »

Distinct надо по Table1.ID1,


AnyaGal wrote:

Code: Select all

SELECT 
  ID1,
  Description
FROM
  Table1
WHERE
  ID1 IN (Select Distinct ID1 FROM Table3 WHERE ID2 IN (1,2))



Так, не понял. Table1.ID is not unique, cудя по первой цитате. Значит как только у вас появится запись с 2-мя одинаковыми ID они продублируюстя в результате.

Или на самом деле надо было делать distinct по Table3.ID2?[/quote]
Никакой разрухи нет. (с) Проф. Преображенский.
User avatar
AnyaGal
Уже с Приветом
Posts: 5771
Joined: 02 Dec 1999 10:01
Location: Saint-Petersburg --> Bellevue, WA

Post by AnyaGal »

Для Table1 ID1 уникальный, для Table3 ни ID1 ни ID2 ne уникальные - это связующая таблица и первичный ключ там составной.

Извиняюсь, Может я вопрос не так поняла.
То есть мне надо было получить записи из таблицы Table1 по ID1 без дубликатов, но только те для которых ID2 в Table3 входит в заданное множество.
SBolgov
Уже с Приветом
Posts: 14006
Joined: 17 Jun 2003 04:41

Post by SBolgov »

AnyaGal wrote:
SBolgov wrote:

Code: Select all

SELECT
  ID1,
  Description
FROM
  Table1
WHERE
  ID1 IN (SELECT ID1 FROM Table3 WHERE ID2 IN (1,2))

Во это наверное лучше, только во второй select Distinct хорошо бы добавить. :roll:

Это без разницы. Результат от этого не зависит.

По идее, даже наоборот - с точки зрения производительности лучше ненужный Distinct не делать. Хотя это "лучше" уже зависит от нюансов реализации.
Не гоните, и не гонимы будете...
SBolgov
Уже с Приветом
Posts: 14006
Joined: 17 Jun 2003 04:41

Post by SBolgov »

Strannik223 wrote:
SBolgov wrote:Разумеется, DISTINCT должен быть только во внутреннем SELECT, а не во внешнем.

Сабина, спасибо! ;)

Ну а толку делать внутренний distinct если при join Table1 дублированые записи опять расплодятся.

Не расплодятся ввиду уникальности ID1 в Table1.

Strannik223 wrote:IMHO не катит

Вы пропустили, что в Table1 уникальные ID1. Если бы были неуникальные, тогда действительно не катило бы.
Не гоните, и не гонимы будете...

Return to “Вопросы и новости IT”