Select Distinct with text field problem in SQL Server

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. Если бы были неуникальные, тогда действительно не катило бы.
Не гоните, и не гонимы будете...
User avatar
Sabina
Уже с Приветом
Posts: 5669
Joined: 13 Oct 2000 09:01
Location: East Bay, CA

Post by Sabina »

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


Вот я тоже над этим второй день думаю ;)
А что если ID там уникальные, а description повторяются?
Или это для Аниной задачи уже не суть важно?

Сабина
User avatar
AnyaGal
Уже с Приветом
Posts: 5771
Joined: 02 Dec 1999 10:01
Location: Saint-Petersburg --> Bellevue, WA

Post by AnyaGal »

SBolgov wrote:
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 не делать. Хотя это "лучше" уже зависит от нюансов реализации.


Да верно, а будут ли дупликаты в IN

Code: Select all

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


без Distinct? По идее будут, так как select может вернуть не уникальные ID1, а в IN они все включатся (например 1,1,1,2,2) или будет (1,2). То есть как работает IN?

[/code]
User avatar
AnyaGal
Уже с Приветом
Posts: 5771
Joined: 02 Dec 1999 10:01
Location: Saint-Petersburg --> Bellevue, WA

Post by AnyaGal »

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


Вот я тоже над этим второй день думаю ;)
А что если ID там уникальные, а description повторяются?
Или это для Аниной задачи уже не суть важно?

Сабина


По идее Description может быть не уникальным, а ID1 (в Table1)- уникальные.
SBolgov
Уже с Приветом
Posts: 14006
Joined: 17 Jun 2003 04:41

Post by SBolgov »

AnyaGal wrote:Да верно, а будут ли дупликаты в IN

Code: Select all

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

без Distinct? По идее будут, так как select может вернуть не уникальные ID1, а в IN они все включатся (например 1,1,1,2,2) или будет (1,2). То есть как работает IN?

Будут, ну и что? :pain1:

О "внутренних" дупликатах Вы можете не беспокоиться. "Наверх" они не вылезут.

"Внешний" запрос

Code: Select all

SELECT ID1, Decription FROM Table1 WHERE ID1 IN (5,7)

работает точно так же, что и

Code: Select all

SELECT ID1, Decription FROM Table1 WHERE ID1 IN (5,7,7,7,5,5,7,5,5,5,5,7)
Не гоните, и не гонимы будете...
SBolgov
Уже с Приветом
Posts: 14006
Joined: 17 Jun 2003 04:41

Post by SBolgov »

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

Вот я тоже над этим второй день думаю ;)
А что если ID там уникальные, а description повторяются?
Или это для Аниной задачи уже не суть важно?

Я исхожу из предположения, что неважно.

Если задача потребует уникальные description (даже с разными ID), то средствами distinct в SQL Server её решить невозможно, как указал KVA во втором посте топика. Нужны другие методы.

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

Post by AnyaGal »

SBolgov wrote:Будут, ну и что? :pain1:

О "внутренних" дупликатах Вы можете не беспокоиться. "Наверх" они не вылезут.



Это-то понятно, но хорошо ли иметь дупликаты в IN? Что будет хуже добавить Distinct или иметь дупликаты в IN?
User avatar
Sabina
Уже с Приветом
Posts: 5669
Joined: 13 Oct 2000 09:01
Location: East Bay, CA

Post by Sabina »

AnyaGal wrote:По идее Description может быть не уникальным, а ID1 (в Table1)- уникальные.


Я упомянула неуникальное Description, допуская вариант, что скажем кто-нибудь занес один и тот же продукт в Table1 дважды. То есть описание будет одинаковое. а ID разные.
Но такая ситуация скорее всего исключена всякими user input verification, триггерами и проч. Умничаю короче :roll: :)
User avatar
Strannik223
Уже с Приветом
Posts: 569
Joined: 14 Dec 2003 04:06
Location: Львов->Киев->Торонто

Post by Strannik223 »

SBolgov wrote:
Strannik223 wrote:IMHO не катит

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


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

Post by AnyaGal »

Я пример Продукты и Категории только для иллюстрации привела. На самом деле там Категории и записи мед.персонала о пациентах, то есть текст записи может повторятся, все будет на совести сестры, главное зафиксировать что запись была сделана тогда-то и тем-то. И все потом ее не удалить ни исправить, только новую запись с исправлениями добавить можно. Как говорится что написано пером, не вырубишь топором. :umnik1:
SBolgov
Уже с Приветом
Posts: 14006
Joined: 17 Jun 2003 04:41

Post by SBolgov »

AnyaGal wrote:Это-то понятно, но хорошо ли иметь дупликаты в IN? Что будет хуже добавить Distinct или иметь дупликаты в IN?

Это зависит от нюансов реализации конкретной СУБД.

Если вы поставите Distinct, то серверу будет чуть-чуть проще искать во "внутреннем" resultset, но зато он обязан предварительно прочесать этот "внутренний" resultset на предмет удаления дубликатов. Это "прочёсывание" запросто может съесть выигрыш, который мы получаем от упрощения поиска.

AnyaGal, ей-богу, не забивайте себе голову, о таких тонкостях разработчик БД может не заботиться.

P.S. Кстати, если мне память не изменяет, далеко не все СУБД позволяют distinct во внутренних подзапросах. Насчёт SQL Server точно не помню.
Не гоните, и не гонимы будете...
User avatar
AnyaGal
Уже с Приветом
Posts: 5771
Joined: 02 Dec 1999 10:01
Location: Saint-Petersburg --> Bellevue, WA

Post by AnyaGal »

Да, уберу-ка я этот Distinct от греха подальше... :roll:

Подытаживая (c) SBolgov-у выносится благодарность за правильное решение в первом же посте. :gen1:
SBolgov
Уже с Приветом
Posts: 14006
Joined: 17 Jun 2003 04:41

Post by SBolgov »

:gen1:
Не гоните, и не гонимы будете...
User avatar
AnyaGal
Уже с Приветом
Posts: 5771
Joined: 02 Dec 1999 10:01
Location: Saint-Petersburg --> Bellevue, WA

Post by AnyaGal »

Всем остальным тоже большое спасибо! :radio%:
maa_t
Новичок
Posts: 85
Joined: 28 Feb 2002 10:01
Location: Beaverton, OR

Post by maa_t »

Это-то понятно, но хорошо ли иметь дупликаты в IN? Что будет хуже добавить Distinct или иметь дупликаты в IN?


то же самое можно через exists:

Code: Select all

 select 
   t1.ID1,
   t1.Description
FROM Table1 t1

where exists
   (
      select *
      from Table3 t3
      where    t3.ID1 = t1.ID1
      and      t3.ID2 in (1, 2)
   )
There are 10 kinds of people. Those who understand binary and those who don't

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