powered by simpleCommunicator - 2.0.31     © 2024 Programmizd 02
Форумы / SQL [закрыт для гостей] / умножить на два
6 сообщений из 6, страница 1 из 1
умножить на два
    #613241
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
s62 Привилегированный пользователь
Участник
Кто разбирается в SQL, может кто прокомментировать?
С БД сейчас мало имею дела по работе. С прошлой работы попросили кое-что сделать с БД и программой учета, которую там писал. По ходу дела возник вопрос. Вот есть запрос, или два запроса.
Код: SQL
1.
2.
3.
4.
5.
select es.element_id from elementtosupplier es
where not exists
(select es1.element_id from elementtosupplier es1
where es1.element_id = es.element_id
and es1.priority = 1)
Этот запрос возвращает 432 записи. Из другого я знаю (блин, можно проверить, но скорей всего это так), что это записи, где поле supplier_id=0.

Теперь для каждой такой записи задаем поле priority = 1
Код: SQL
1.
2.
3.
4.
5.
6.
7.
8.
9.
update elementtosupplier
set priority = 1
where supplier_id=0
and element_id in
(select es.element_id from elementtosupplier es
where not exists
(select es1.element_id from elementtosupplier es1
where es1.element_id = es.element_id
and es1.priority = 1))
Тут конец запроса совпадает с первым.
И IBExpert показывает, что изменено 864 записи, т.е. в 2 раза больше.
Я предполагаю, что тут каждая запись как-то 2 раза посчитана. Результаты смотрел, вроде всё ок, как должно быть.

ВОПРОС:
Может быть такое, что во втором запросе именно, что просто 2 раза каждая запись учтена? Если да, то почему?

Чтобы понятнее, в таблице elementtosupplier, вот такой:
Код: SQL
1.
2.
3.
4.
5.
6.
7.
8.
CREATE TABLE ELEMENTTOSUPPLIER (
    ELEMENT_ID   INTEGER NOT NULL,
    SUPPLIER_ID  INTEGER NOT NULL,
    PRIORITY     INTEGER,
    PRICE        PRICES /* PRICES = NUMERIC(14,4) */
);

ALTER TABLE ELEMENTTOSUPPLIER ADD CONSTRAINT PK_ELEMENTTOSUPPLIER PRIMARY KEY (ELEMENT_ID, SUPPLIER_ID);
Для каждого элемента должен быть поставщик с supplier_id=0 (он и есть у всех) и для каждого элемента хоть один поставщик должен иметь приоритет 1 (приоритет может быть 0 и 1). Первый скрипт выводит список элементов, у которых нет приоритетного поставщика Во втором скрипте всем элементам, у кого нет приоритетного поставщика, приоритетным задается поставщик c ID=0.
...
Изменено: 15.11.2023, 18:50 - s62
Рейтинг: 0 / 0
умножить на два
    #613329
IT-Клоп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
уникален ведь не ELEMENT_ID, а пара ELEMENT_ID, SUPPLIER_ID

что-то все таки может быть не так с SUPPLIER_ID
...
Рейтинг: 0 / 0
умножить на два
    #614076
Горбатый ёж
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s62  15.11.2023, 18:39
[игнорируется]
Код: SQL
1.
2.
3.
4.
5.
select es.element_id from elementtosupplier es
where not exists
(select es1.element_id from elementtosupplier es1
where es1.element_id = es.element_id
and es1.priority = 1)
Очень странный запрос.
Зачем используется not exists?
Проще переписать на
Код: SQL
1.
2.
select es.element_id from elementtosupplier es
where es.priority <> 1 or es.priority is null
И это ещё не всё.
update можно написать гораздо проще, без всяких select
Код: SQL
1.
2.
3.
4.
update elementtosupplier
set priority = 1
where supplier_id = 0
and (es.priority <> 1 or es.priority is null)
Для проверки сколько записей проапдейтятся пишешь запрос
Код: SQL
1.
2.
3.
select * from  elementtosupplier
where supplier_id = 0
and (es.priority <> 1 or es.priority is null)
...
Рейтинг: 0 / 0
умножить на два
    #614258
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
s62 Привилегированный пользователь
Участник
Горбатый ёж  16.11.2023, 07:56
[игнорируется]
s62  15.11.2023, 18:39
[игнорируется]
Код: SQL
1.
2.
3.
4.
5.
select es.element_id from elementtosupplier es
where not exists
(select es1.element_id from elementtosupplier es1
where es1.element_id = es.element_id
and es1.priority = 1)
Очень странный запрос.
Зачем используется not exists?
Проще переписать на
Код: SQL
1.
2.
select es.element_id from elementtosupplier es
where es.priority <> 1 or es.priority is null
Эти два запроса разные наборы данных возвратят. Может я не совсем подробно ситуацию описал. Вечером наверное отвечу подробней.
У каждого элемента, у которого есть несколько поставщиков, есть поставщики, которые не являются приоритетными. Твой запрос возвратит все такие записи, точнее - element_id из всех таких записей. А первый запрос возвратит записи для тех элементов, у которых ни один поставщик не указан приоритетным. (А должен бы хотя бы один.)
...
Изменено: 16.11.2023, 10:40 - s62
Рейтинг: 0 / 0
умножить на два
    #614448
Горбатый ёж
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s62  16.11.2023, 10:37
[игнорируется]
У каждого элемента, у которого есть несколько поставщиков, есть поставщики, которые не являются приоритетными. Твой запрос возвратит все такие записи, точнее - element_id из всех таких записей. А первый запрос возвратит записи для тех элементов, у которых ни один поставщик не указан приоритетным. (А должен бы хотя бы один.)
А, понятно. Поторопился я.
Сорри.
...
Изменено: 16.11.2023, 12:35 - Горбатый ёж
Рейтинг: 0 / 0
умножить на два
    #743536
Фотография Владайка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
глупое нахвание топика
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / SQL [закрыт для гостей] / умножить на два
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]