Форум программистов, компьютерный форум, киберфорум
Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.53/352: Рейтинг темы: голосов - 352, средняя оценка - 4.53
0 / 0 / 0
Регистрация: 05.03.2014
Сообщений: 34

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

02.10.2015, 11:51. Показов 64685. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток. Задача на мой взгляд очень простая, но у меня не получается сделать работающий запрос. СУБД - 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
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.10.2015, 11:51
Ответы с готовыми решениями:

(Insert) Несколько значений одному столбцу
Всем привет. Возможно ли вставить несколько значений одному столбцу? Например: Есть таблица Клиент с полями (ID, Fio, Phone), Так же...

Извлечь данные по одному столбцу
Доброго времени суток. Нужна ваша помощь. Делаю запрос и столкнулся со следующим вопросом. В большой таблице, в одном из столбцов ...

ADO vs Excel Вывести дубликаты (повторения по одному столбцу)
С помощью ADODB.Connection прочитать данные с листа эксель и вывести на лист № 2 целиком записи, в которых дублируется значение в поле...

21
66 / 64 / 24
Регистрация: 14.10.2014
Сообщений: 339
02.10.2015, 14:02
Вы сами понимаете, что должно получиться? Как Вы себе представляете Distinct по одной колонке, приведите пример результата.
0
 Аватар для KuKu
1563 / 1041 / 94
Регистрация: 17.04.2009
Сообщений: 2,995
02.10.2015, 14:30
Желание действительно довольно наркоманское. Если действительно неважно, что брать из t2:
1) можно у полей из t2 вставить какую-нибудь агрегатную функцию
2) предварительно через какой-нибудь row_number отсеять дубли из t2
Лучше второй вариант
0
0 / 0 / 0
Регистрация: 05.03.2014
Сообщений: 34
02.10.2015, 23:07  [ТС]
Цитата Сообщение от 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
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
05.10.2015, 12:55
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
0 / 0 / 0
Регистрация: 05.03.2014
Сообщений: 34
05.10.2015, 15:39  [ТС]
Цитата Сообщение от turbanoff Посмотреть сообщение
Какие значения для других столбцов брать? Любые, которые есть?
Почему в вашем запросе выбран именно 2008 год для 436, а не 2011?
Да, любые. 2008 год выбран как первый попавшийся.
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
05.10.2015, 16:12
amicus_ratio, тогда мой запрос должен подойти.
Можно попробовать еще убрать лишнюю сортировку, если вам не важен порядок
SQL
1
ROW_NUMBER() OVER (partition BY t1.numb ORDER BY NULL) RN
0
0 / 0 / 0
Регистрация: 05.03.2014
Сообщений: 34
05.10.2015, 16:29  [ТС]
turbanoff, Сейчас проверить возможности не имею. Как буду на работе, проверю и отпишусь.
0
1 / 1 / 1
Регистрация: 10.02.2013
Сообщений: 56
05.03.2018, 17:26
Парень, я уже начинаю переживать, ты до работы-то добрался?
1
09.03.2018, 08:45

Не по теме:


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

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

зы извините за оффтоп)
0
4 / 4 / 0
Регистрация: 24.02.2016
Сообщений: 229
09.04.2019, 11:46
Коллеги, приветствую!

Подниму тему и задам свой вопрос по теме.
Есть таблица в БД. Забираю ее всю по запросу (в таблице более 20 столбцов)
SQL
1
SELECT * FROM Main_tube_chamber_tb
Сейчас встала задача забирать так же всю таблицу, но только с уникальными записями по столбцу Main_tube_type
Как мне вписать в запрос DISTINCT примененный только к столбцу Main_tube_type?

С уважением, Алексей.
0
5967 / 4543 / 1094
Регистрация: 29.08.2013
Сообщений: 28,157
Записей в блоге: 3
09.04.2019, 12:29
так и писать
SQL
1
SELECT DISTINCT a FROM b
или
SQL
1
SELECT a FROM b GROUP BY a
0
4 / 4 / 0
Регистрация: 24.02.2016
Сообщений: 229
09.04.2019, 12:33
qwertehok, тогда из таблицы b я забираю не всю таблицу, а только столбец a
А мне нужны все столбцы, но с DISTINCT примененному к a
0
 Аватар для pincet
1654 / 1153 / 173
Регистрация: 23.07.2010
Сообщений: 6,910
09.04.2019, 12:47
как вариант - join на себя с distinct
0
4 / 4 / 0
Регистрация: 24.02.2016
Сообщений: 229
09.04.2019, 12:53
Вот такой вариант попробовал. Не сработало.
SQL
1
2
3
4
5
SELECT * 
FROM Main_tube_chamber_tb 
WHERE Main_tube_type 
IN (SELECT DISTINCT Main_tube_type FROM Main_tube_chamber_tb) 
ORDER BY Main_tube_type
0
5967 / 4543 / 1094
Регистрация: 29.08.2013
Сообщений: 28,157
Записей в блоге: 3
09.04.2019, 12:56
вот таблица

1 два
1 три
2 четыре
2 пять

по 1 колонке получить уникальные можно, но стоит захватить вторую колонку и у нас уникальность распадается
0
4 / 4 / 0
Регистрация: 24.02.2016
Сообщений: 229
09.04.2019, 12:59
Нужен код запроса, который бы выдал результат
1 два
2 четыре
т.е. уникальность по первому столбцу (в моем случае название столбца Main_tube_type)
0
 Аватар для pincet
1654 / 1153 / 173
Регистрация: 23.07.2010
Сообщений: 6,910
09.04.2019, 13:03
Allleksey,
огласи СУБД и пойми для себя, что есть "уникальность". ибо qwertehok, тебе уже за это намекнул
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.04.2019, 13:03
Помогаю со студенческими работами здесь

DISTINCT по одному полю с выводом значений по остальным
Подскажите пожалуйста как сделать DISTINCT по одному полю c максимальной датой чтобы при этом также выводились значения остальных полей....

Несколько значений одному столбцу
Добрый день. И снова к вам. Собственно, из заголовка все ясно. Необходимо вытащить записи, где dostup = 1, 5, 3, примеру.

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

Сортировка строк по одному столбцу
Как отсортировать таблицу по одному числовому столбцу, чтобы числа шли по возрастанию вместе с своими строками.? Спасибо.

Фильтрация в DataGridView по одному столбцу
Фильтрация в DataGridView по одному столбцу,чтобы при вводе данных из этого столбца в TextBox и нажатии на кнопку, скрывались строки не...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru