Форум программистов, компьютерный форум, киберфорум
Наши страницы
Базы данных
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
amicus_ratio
0 / 0 / 0
Регистрация: 05.03.2014
Сообщений: 34
1

DISTINCT применяемый только к одному столбцу

02.10.2015, 11:51. Просмотров 2744. Ответов 11
Метки нет (Все метки)

Доброго времени суток. Задача на мой взгляд очень простая, но у меня не получается сделать работающий запрос. СУБД - IBM DB2. Извлекаются данные из двух таблиц, которые связываются по ID. При выполнении запроса с DISTINCT, он отбирает уникальные комбинации всех полей одной записи. А мне нужны уникальные записи одного поля, даже если им соответствует по две записи из другого поля.
SQL
1
2
3
SELECT DISTINCT t1.numb, t1.numadr, t1.fam, t1.im, t2.god, t2.pr1, t2.pr2 
FROM t1 INNER JOIN t2 ON t1.id = t2.id
WHERE (t1.numadr = 5) AND (t2.pr1 = 1)
Так как t1.number соответствует две записи из t2.year у меня получаются повторяющиеся записи в t1.number. Именно это поле у меня в результирующей выборке должен содержать уникальные поля, и без разницы какой из соответствующих ему полей t2 он подставит в результате. Выходом должен был стать group by, на DB2 на него ругается.
Кликните здесь для просмотра всего текста
Выражение, начинающееся с "ID " и заданное в условии SELECT, условии HAVING или условии ORDER BY, не задано в условии GROUP BY, или же оно задано в в условии SELECT, условии HAVING или условии ORDER BY вместе с функцией столбца, но условие GROUP BY не задано.

Объяснение:

В операторе SELECT есть одна из следующих ошибок:
* Указанное выражение и функция столбца содержатся в условии SELECT,
условии HAVING или условии ORDER BY, но при этом отсутствует условие
GROUP BY.
* Указанное выражение содержится в условии SELECT, условии HAVING или
условии ORDER BY, но не входит в условие GROUP BY.

Указанное выражение начинается с "<начало-выражения>". Это выражение
может представлять собой имя одного столбца.

Если в условии HAVING заданы функции NODENUMBER или PARTITION,
считается, что все столбцы ключей разделения основной таблицы входят в
условие HAVING.

Оператор невозможно обработать.

Действия пользователя:

Исправьте оператор, включив в условие GROUP BY выражение, входящее в
условие SELECT, условие HAVING или условие ORDER BY, или удалив функцию
столбца из оператора SELECT.

sqlcode: -119

sqlstate: 42803

Что можете предложить?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.10.2015, 11:51
Ответы с готовыми решениями:

Count(Distinct FIELD)
Почему-то в SQL 7 работает, а в Access нет! можно так: Count(select...

Ошибка при использовании DISTINCT, ORDER BY и CASE
Есть запрос, он выполняется без ошибок, но есть дублирующие записи SELECT ...

Distinct после find
Добрый день. Начал изучать mongoDB(в универе задали, личной заинтересованности...

(Insert) Несколько значений одному столбцу
Всем привет. Возможно ли вставить несколько значений одному столбцу? Например:...

Distinct по полю
Всем добрый вечер. Скажите пожалуйста.... есть таблица id name 1 Морковка...

11
ApXyC
60 / 60 / 24
Регистрация: 14.10.2014
Сообщений: 308
02.10.2015, 14:02 2
Вы сами понимаете, что должно получиться? Как Вы себе представляете Distinct по одной колонке, приведите пример результата.
0
KuKu
1559 / 1037 / 93
Регистрация: 17.04.2009
Сообщений: 2,995
02.10.2015, 14:30 3
Желание действительно довольно наркоманское. Если действительно неважно, что брать из t2:
1) можно у полей из t2 вставить какую-нибудь агрегатную функцию
2) предварительно через какой-нибудь row_number отсеять дубли из t2
Лучше второй вариант
0
amicus_ratio
0 / 0 / 0
Регистрация: 05.03.2014
Сообщений: 34
02.10.2015, 23:07  [ТС] 4
Цитата Сообщение от ApXyC Посмотреть сообщение
Вы сами понимаете, что должно получиться? Как Вы себе представляете Distinct по одной колонке, приведите пример результата.
Представляю, конечно:
t1.numbt1.fam...t2.godt2.pr1t2.pr2
436Иванов...200810
564Петров...201011
137Сидоров...200911
А у меня получается:
t1.numbt1.fam...t2.godt2.pr1t2.pr2
436Иванов...200810
436Иванов...201110
564Петров...201011
137Сидоров...200911
137Сидоров...201211

Добавлено через 4 минуты
Цитата Сообщение от KuKu Посмотреть сообщение
Желание действительно довольно наркоманское. Если действительно неважно, что брать из t2:
1) можно у полей из t2 вставить какую-нибудь агрегатную функцию
2) предварительно через какой-нибудь row_number отсеять дубли из t2
Лучше второй вариант
Почему это наркоманское?? Поясните, пожалуйста, примером, что такое агрегатная функция. И как при помощи row_number отсеять дубли?
0
turbanoff
Эксперт Java
4019 / 3754 / 742
Регистрация: 18.05.2010
Сообщений: 9,329
Записей в блоге: 11
Завершенные тесты: 1
05.10.2015, 12:55 5
amicus_ratio, Какие значения для других столбцов брать? Любые, которые есть?
Почему в вашем запросе выбран именно 2008 год для 436, а не 2011?

Добавлено через 2 минуты
Как-то так обычно делают
SQL
1
2
3
4
5
6
SELECT numb, numadr, fam, im, god, pr1, pr2
FROM (
   SELECT t1.numb, t1.numadr, t1.fam, t1.im, t2.god, t2.pr1, t2.pr2, ROW_NUMBER() OVER (partition BY t1.numb ORDER BY t2.god) RN
   FROM t1 INNER JOIN t2 ON t1.id = t2.id
   WHERE (t1.numadr = 5) AND (t2.pr1 = 1)
) WHERE RN = 1
Нет под рукой DB2 проверить, работает ли там row_number
1
amicus_ratio
0 / 0 / 0
Регистрация: 05.03.2014
Сообщений: 34
05.10.2015, 15:39  [ТС] 6
Цитата Сообщение от turbanoff Посмотреть сообщение
Какие значения для других столбцов брать? Любые, которые есть?
Почему в вашем запросе выбран именно 2008 год для 436, а не 2011?
Да, любые. 2008 год выбран как первый попавшийся.
0
turbanoff
Эксперт Java
4019 / 3754 / 742
Регистрация: 18.05.2010
Сообщений: 9,329
Записей в блоге: 11
Завершенные тесты: 1
05.10.2015, 16:12 7
amicus_ratio, тогда мой запрос должен подойти.
Можно попробовать еще убрать лишнюю сортировку, если вам не важен порядок
SQL
1
ROW_NUMBER() OVER (partition BY t1.numb ORDER BY NULL) RN
0
amicus_ratio
0 / 0 / 0
Регистрация: 05.03.2014
Сообщений: 34
05.10.2015, 16:29  [ТС] 8
turbanoff, Сейчас проверить возможности не имею. Как буду на работе, проверю и отпишусь.
0
mrkid
1 / 1 / 1
Регистрация: 10.02.2013
Сообщений: 45
Завершенные тесты: 1
05.03.2018, 17:26 9
Парень, я уже начинаю переживать, ты до работы-то добрался?
1
qwertehok
09.03.2018, 08:45
  #10

Не по теме:


mrkid, а ты каждый день ждал что он доберется? 3 года всего прошло, а пробке еще стоит

0
amicus_ratio
0 / 0 / 0
Регистрация: 05.03.2014
Сообщений: 34
14.03.2018, 11:22  [ТС] 11
Цитата Сообщение от mrkid Посмотреть сообщение
Парень, я уже начинаю переживать, ты до работы-то добрался?
Только что доехал)) И это "долгая дорога" заставила забыть, зачем мне это было нужно) И вот спустя три года, смотрю на свой вопрос и не понимаю, что же я хотел в итоге получить. Как выразились выше, желание теперь уже мне самому кажется наркоманским. Но для какой задачи это было, уже не вспомнить.
0
mrkid
1 / 1 / 1
Регистрация: 10.02.2013
Сообщений: 45
Завершенные тесты: 1
14.03.2018, 23:12 12
ну слава богу)))

зы извините за оффтоп)
0
14.03.2018, 23:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.03.2018, 23:12

Нестандартный DISTINCT
Надо вывести из таблицы ВИД наименования, отфильтрованные по полю НОМЕР....

Нужен совет с (distinct)
Есть таблица Main и хочу из нее достать все. отфильтровав столбцом ИП делаю...

Entity sql составление запроса с DISTINCT по одному полю
Доброго всем времени суток. Нужно разработать запрос для получения данных на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru