Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
8 / 8 / 7
Регистрация: 01.01.2016
Сообщений: 383
1

Ошибка при создании вложенного запроса

16.01.2016, 16:42. Просмотров 889. Ответов 12
Метки нет (Все метки)

Создаю запрос для вывода всех различных значений по полю ProizvTovara, но выбивает ошибка:
"Данный подчиненный запрос должен возвращать не более одной записи" и ничего не выдает.
Что здесь не так?

SQL
1
2
3
4
5
SELECT *
FROM SprProizvTovara
WHERE ProizvTovara =
(SELECT DISTINCT ProizvTovara
FROM SprProizvTovara)
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.01.2016, 16:42
Ответы с готовыми решениями:

Ошибка при создании запроса к базе Access
Сразу хочу пояснить, я не программист, начальник попросил на работе сделать программку для учета...

Ошибка при создании запроса
Всем привет. Делаю такой запрос: CREATE TABLE employee(id BIGINT PRIMARY KEY, ...

Ошибка при создании запроса
Здравствуйте,создаю таблицу CREATE TABLE CLIENT (ID_CLIENT INTEGER PRIMARY KEY CHECK...

Ошибка при создании запроса SQL
Создаю простейщий запрос и вылетает ошибка: Ядро базы данных Microsoft Jet не может найти входную...

12
1042 / 965 / 330
Регистрация: 07.08.2012
Сообщений: 2,735
16.01.2016, 18:17 2
SQL
1
SELECT DISTINCT ProizvTovara FROM SprProizvTovara
0
8 / 8 / 7
Регистрация: 01.01.2016
Сообщений: 383
16.01.2016, 19:59  [ТС] 3
Да, я уже пробовал, но мне еще нужно вывести это в DBLookupComboBox1, а для этого мне в результате запроса еще нужно получить IDProizvTovara.
Извиняюсь, мой листинг может тоже не выводит IDProizvTovara, но я не знаю как его вывести, вот в чем и вопрос. Я просто пробовал по другому создать подзапрос и ошибка выскакивала та же.
0
1042 / 965 / 330
Регистрация: 07.08.2012
Сообщений: 2,735
16.01.2016, 20:42 4
С DBLookupComboBox нужно работать совсем по-другому.
1. Разместить специально для DBLookupComboBox компоненты ADOQuery1 и DataSource1.
2. ADOQuery1 установить свойство Connection и вписать в SQL вышеприведенный запрос.
3. В свойстве DataSet компонента DataSource1 указать ADOQuery1.
4. В свойствах компонента DBLookupComboBox1:
- ListSource указать DataSource1;
- KeyField указать IDProizvTovara;
- ListField указать ProizvTovara
И, наконец, не забыть открыть ADOQuery1.

Для получения значения IDProizvTovara, выбранного пользователем элемента из списка, используется свойство KeyValue компонента DBLookupComboBox1
1
8 / 8 / 7
Регистрация: 01.01.2016
Сообщений: 383
16.01.2016, 21:03  [ТС] 5
Цитата Сообщение от Скандербег Посмотреть сообщение
2. ADOQuery1 установить свойство Connection
Здесь Вы имеете в виду ConnectionString?
Все остальное я сделал как Вы написали и DBLookupComboBox1 оказался неактивным.
А если брать именно Connection, то оно не открывается, выбирать не из чего.
0
1042 / 965 / 330
Регистрация: 07.08.2012
Сообщений: 2,735
16.01.2016, 21:13 6
Цитата Сообщение от edsjeka Посмотреть сообщение
Здесь Вы имеете в виду ConnectionString?
Нет. Именно Connection, которое соединяет ADOQuery с БД через ADOConnection.
1
8 / 8 / 7
Регистрация: 01.01.2016
Сообщений: 383
16.01.2016, 21:45  [ТС] 7
Цитата Сообщение от Скандербег Посмотреть сообщение
Нет. Именно Connection, которое соединяет ADOQuery с БД через ADOConnection.
Спасибо, сейчас попробую.

Добавлено через 1 минуту
Добавлено через 27 минут
Цитата Сообщение от Скандербег Посмотреть сообщение
1
SELECT DISTINCT ProizvTovara FROM SprProizvTovara
После этого запроса невозможно сделать:
Цитата Сообщение от Скандербег Посмотреть сообщение
- KeyField указать IDProizvTovara;
, т.к. результат запроса таблица с одним не повторяющимся полем ProizvTovara, а IDProizvTovara он не видит, т.к. не отображается в результате запроса.
0
1042 / 965 / 330
Регистрация: 07.08.2012
Сообщений: 2,735
16.01.2016, 23:25 8
Если у одинаковых значений поля ProizvTovara тоже одинаковые значение IDProizvTovara, то в запрос достаточно добавить поле IDProizvTovara:
SQL
1
SELECT DISTINCT IDProizvTovara, ProizvTovara FROM SprProizvTovara
А вообще, если это справочник производителей товаров (судя по отрывкам названий), то в нем не должно быть
повторяющихся названий производителей и слово distinct не нужно.
1
8 / 8 / 7
Регистрация: 01.01.2016
Сообщений: 383
17.01.2016, 10:23  [ТС] 9
Цитата Сообщение от Скандербег Посмотреть сообщение
SQLВыделить код
1
SELECT DISTINCT IDProizvTovara, ProizvTovara FROM SprProizvTovara
Да это справочник производителей. Производители там могут повторятся, потому что справочник подчиняется другой таблице тип товара и у разных типов товара могут быть одинаковые производители. Не может повторятся IDProizvTovara.
Но дело не в этом, я пытаюсь сделать так:

SELECT DISTINCT ProizvTovara, IDProizvTovara FROM SprProizvTovara

и не получается, т.е. ProizvTovara все-равно повторяется, как будто DISTINCT действует вот так: DISTINCT (ProizvTovara, IDProizvTovara) а не только на ProizvTovara. Может так и есть?
0
1042 / 965 / 330
Регистрация: 07.08.2012
Сообщений: 2,735
17.01.2016, 10:39 10
DISTINCT определяет уникальные сочетания значений в перечисленных полях и только такие записи оказываются в наборе данных.
Т.е. для цели, которая обозначена в теме DISTINCT не годится.
Цитата Сообщение от edsjeka Посмотреть сообщение
Да это справочник производителей. Производители там могут повторятся
В справочнике производители не могут повторяться по какой бы то не было причине.
Если это так, то нарушены базовые правила построения реляционных баз данных.

К примеру, какое значение идентификатора (IDProizvTovara) производителя вы собираетесь получить, если у него этих уникальных идентификаторов два или более? Какой из них будет правильным?
Даже из этого примера понятно, что структура базы спроектирована с нарушением правил разработки БД.
1
8 / 8 / 7
Регистрация: 01.01.2016
Сообщений: 383
17.01.2016, 10:57  [ТС] 11
Цитата Сообщение от Скандербег Посмотреть сообщение
Даже из этого примера понятно, что структура базы спроектирована с нарушением правил разработки БД.
Спасибо за помощь, не удивляйтесь, я самоучка, хочу разобраться.
А если у меня в этом справочнике производителей еще есть поле IDTipaTovara, по которому я определяю принадлежность определенных производителей к определенному типу товара это тоже неправильно для реляционных БД? Т.е. у меня есть разные типы товаров, к примеру: Материнские платы и Видеокарты у них могут быть производители как совпадающие, так и разные, мне нужно чтобы при открытии справочника производителей для определенного типа товара открывались производители только для этого типа товара. Для этого у меня есть справочник производителей товара, в котором производители могут повторяться, но есть еще одно поле IDTipaTovara, через которое я связываю тип товара и производителя и получается, что хоть производители и повторяются, но они однозначно увязаны с определенным типом товара.
Здесь мне кажется нет никаких нарушений принципов БД. Или я не правильно думаю?
0
1042 / 965 / 330
Регистрация: 07.08.2012
Сообщений: 2,735
17.01.2016, 11:13 12
Лучший ответ Сообщение было отмечено edsjeka как решение

Решение

Ну да, неправильно.
Как было показано, у каждого из производителей должен быть уникальный идентификатор.
Два и более идентификатора для одного производителя- это перебор, который грозит проблемами, которые, кстати, мы уже огребли.

В справочнике производителя не должно быть поля IDTipaTovara.
По идее нужна еще одна таблица, в которой будут связаны ID производителя и ID товара.
Это называют связью многие-ко-многим.
Такая "буферная" таблица, как правило, состоит из трех полей:
ID (счетчик)
IDProizvTovara - идентификатор-ссылка на строку таблицы производителей
IDTovara - идентификатор-ссылка на строку таблицы товаров.

В этом случае каждому производителю можно привязать любое количество типов товара, а у каждого товара может быть любое количество производителей.
1
8 / 8 / 7
Регистрация: 01.01.2016
Сообщений: 383
17.01.2016, 11:17  [ТС] 13
Цитата Сообщение от Скандербег Посмотреть сообщение
Ну да, неправильно.
Как было показано, у каждого из производителей должен быть уникальный идентификатор.
Два и более идентификатора для одного производителя- это перебор, который грозит проблемами, которые, кстати, мы уже огребли.
В справочнике производителя не должно быть поля IDTipaTovara.
По идее нужна еще одна таблица, в которой будут связаны ID производителя и ID товара.
Это называют связью многие-ко-многим.
Такая "буферная" таблица, как правило, состоит из трех полей:
ID (счетчик)
IDProizvTovara - идентификатор-ссылка на строку таблицы производителей
IDTovara - идентификатор-ссылка на строку таблицы товаров.
В этом случае каждому производителю можно привязать любое количество типов товара, а у каждого товара может быть любое количество производителей.
Спасибо огромное!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.01.2016, 11:17

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Ошибка при создании запроса к бд access
При создании запроса вылазит ошибка. SELECT Pynkt.IdPunkt, Pynkt.Naimenovanie, Pynkt.IdRn,...

Ошибка при создании запроса с Group by
Добрый день! Подскажите пожалуйста, как правильно подправить запрос, чтобы не было ошибки с group...

EXaro: ошибка при создании запроса
В eXaro нужно создать отчет по БД. Ввожу запрос: SELECT FIO, n_kaf, _Year, n_SfD, n_pokaz, n_izm,...

Ошибка при создании запроса на подсчет дней
Добрый день, помогите, пожалуйста. Дело вот в чём при попытке запустить запрос выскакивает ошибка...


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

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

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