powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Нужна помощь с модифицирующим запросом
20 сообщений из 20, страница 1 из 1
Нужна помощь с модифицирующим запросом
    #38403355
genok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
три таблицы - USERS, USLUGI, USL_FEE
в последней - величины зарплат специалистов (USERS) от оказанных услуг (USLUGI)

возможен ли в принципе модифицирующий запрос, который будет делать зарплаты одного специалиста равными зарплатам другого?


скрипты
SET SQL DIALECT 3;

CREATE TABLE USERS (
USER_ID INTEGER NOT NULL,
USER_NAME VARCHAR(10)
);

CREATE TABLE USLUGI (
USL_ID INTEGER NOT NULL,
USL_NAME VARCHAR(10)
);

CREATE TABLE USL_FEE (
UF_ID INTEGER NOT NULL,
USER_ID INTEGER,
USL_ID INTEGER,
FEE INTEGER
);

INSERT INTO USLUGI (USL_ID, USL_NAME)
VALUES (1, 'услуга 1');
INSERT INTO USLUGI (USL_ID, USL_NAME)
VALUES (2, 'услуга 2');
INSERT INTO USLUGI (USL_ID, USL_NAME)
VALUES (3, 'услуга 3');
INSERT INTO USLUGI (USL_ID, USL_NAME)
VALUES (4, 'услуга 4');
INSERT INTO USLUGI (USL_ID, USL_NAME)
VALUES (5, 'услуга 5');

INSERT INTO USERS (USER_ID, USER_NAME)
VALUES (1, 'иванов');
INSERT INTO USERS (USER_ID, USER_NAME)
VALUES (2, 'петров');
INSERT INTO USERS (USER_ID, USER_NAME)
VALUES (3, 'сидоров');

INSERT INTO USL_FEE (UF_ID, USER_ID, USL_ID, FEE)
VALUES (1, 1, 1, 11);
INSERT INTO USL_FEE (UF_ID, USER_ID, USL_ID, FEE)
VALUES (2, 1, 2, 12);
INSERT INTO USL_FEE (UF_ID, USER_ID, USL_ID, FEE)
VALUES (3, 1, 3, 13);
INSERT INTO USL_FEE (UF_ID, USER_ID, USL_ID, FEE)
VALUES (4, 1, 4, 14);
INSERT INTO USL_FEE (UF_ID, USER_ID, USL_ID, FEE)
VALUES (5, 1, 5, 15);
INSERT INTO USL_FEE (UF_ID, USER_ID, USL_ID, FEE)
VALUES (6, 2, 1, 21);
INSERT INTO USL_FEE (UF_ID, USER_ID, USL_ID, FEE)
VALUES (7, 2, 2, 22);
INSERT INTO USL_FEE (UF_ID, USER_ID, USL_ID, FEE)
VALUES (8, 2, 3, 23);
INSERT INTO USL_FEE (UF_ID, USER_ID, USL_ID, FEE)
VALUES (9, 2, 4, 24);
INSERT INTO USL_FEE (UF_ID, USER_ID, USL_ID, FEE)
VALUES (10, 2, 5, 25);
INSERT INTO USL_FEE (UF_ID, USER_ID, USL_ID, FEE)
VALUES (11, 3, 1, 31);
INSERT INTO USL_FEE (UF_ID, USER_ID, USL_ID, FEE)
VALUES (12, 3, 2, 32);
INSERT INTO USL_FEE (UF_ID, USER_ID, USL_ID, FEE)
VALUES (13, 3, 3, 33);
INSERT INTO USL_FEE (UF_ID, USER_ID, USL_ID, FEE)
VALUES (14, 3, 4, 34);
INSERT INTO USL_FEE (UF_ID, USER_ID, USL_ID, FEE)
VALUES (15, 3, 5, 35);

COMMIT WORK;
...
Рейтинг: 0 / 0
Нужна помощь с модифицирующим запросом
    #38403356
genok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в настоящее время приходится обрабатывать каждую пару записей отдельно.
А хочется чтобы красиво)
...
Рейтинг: 0 / 0
Нужна помощь с модифицирующим запросом
    #38403369
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
genokв настоящее время приходится обрабатывать каждую пару записей отдельно.
А хочется чтобы красиво)

Каждую пару это как???
...
Рейтинг: 0 / 0
Нужна помощь с модифицирующим запросом
    #38403374
genok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m7mgenokв настоящее время приходится обрабатывать каждую пару записей отдельно.
А хочется чтобы красиво)

Каждую пару это как???

берем первую запись для 1-го специалиста, присваиваем значение зарплаты от такой же записи 2-го специалиста
переходим ко второй записи, повторяем.
и так до тех пор, пока записи зарплаты для 1-го специалиста не закончатся.

как-то так
...
Рейтинг: 0 / 0
Нужна помощь с модифицирующим запросом
    #38403378
genok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот такой запрос собирает в кучу все данные, которые нужны и в таком виде, каком надо

Код: sql
1.
2.
3.
4.
5.
6.
select uf.uf_id, u.user_name, us.usl_name, uf.fee, uf2.fee as FEE2
from usl_fee uf
left join users u on uf.user_id=u.user_id
left join uslugi us on uf.usl_id=us.usl_id
left join usl_fee uf2 on uf.usl_id=uf2.usl_id and uf2.user_id=3
where uf.user_id=1



как бы из него модифицирующий сделать?
...
Рейтинг: 0 / 0
Нужна помощь с модифицирующим запросом
    #38403390
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
genokберем первую запись для 1-го специалиста, присваиваем значение зарплаты от такой же записи 2-го специалиста
переходим ко второй записи, повторяем.
и так до тех пор, пока записи зарплаты для 1-го специалиста не закончатся.


Код: sql
1.
2.
Delete from USL_FEE f where f.user_id=3;
insert into USL_FEE (USER_ID,USL_ID,FEE) select 3,USL_ID,FEE from USL_FEE f where f.user_id=1;


Где-то так (но что-то в связи с 14866730 уверенности у меня нет, в том что правильно понял)

ps/ UF_ID посади на генерато
...
Рейтинг: 0 / 0
Нужна помощь с модифицирующим запросом
    #38403397
genok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m7m
Код: sql
1.
2.
Delete from USL_FEE f where f.user_id=3;
insert into USL_FEE (USER_ID,USL_ID,FEE) select 3,USL_ID,FEE from USL_FEE f where f.user_id=1;


Где-то так (но что-то в связи с 14866730 уверенности у меня нет, в том что правильно понял)



работает, спасибо за подсказку
но все-таки - одним запросом UPDATE это никак не сделать?
...
Рейтинг: 0 / 0
Нужна помощь с модифицирующим запросом
    #38403414
ooo_kontakt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
genokm7m
Код: sql
1.
2.
Delete from USL_FEE f where f.user_id=3;
insert into USL_FEE (USER_ID,USL_ID,FEE) select 3,USL_ID,FEE from USL_FEE f where f.user_id=1;


Где-то так (но что-то в связи с 14866730 уверенности у меня нет, в том что правильно понял)



работает, спасибо за подсказку
но все-таки - одним запросом UPDATE это никак не сделать?

Жуткая постановка задачи. Я так понимаю, что разные специалисты могут выполнить один и тот же (одинаковый) объем работ, а если нет? Вот если для уравниловки (или для мертвых душ), то можно так:
create procedure COPY_FEE(FID integer, copy_all integer)
-- FID - с кого копируем ; copy_all - все услуги=1
as
DECLARE VARIABLE USER_ID INTEGER;
DECLARE VARIABLE USL_ID INTEGER;
DECLARE VARIABLE FEE INTEGER;
DECLARE VARIABLE ID INTEGER;
begin
-- поток "остальных" специалистов, окромя прецизионного
for SELECT USER_ID from USERS where USER_ID<>:FID INTO :USER_ID do
-- поток услуг и оплат
for select USL_ID,FEE FROM USL_FEE WHERE USER_ID=:FID into :USL_ID,:FEE DO
begin
id=null; -- обязательно!
select first(1) UF_ID from USL_FEE where USER_ID=:USER_ID and USL_ID into :ID;
-- ID показывает наличие ранее введенной записи
IF (id is not null) then update USL_FEE set FEE=:FEE where id=:id; else
-- не найдено
IF (copy_all=1) THEN -- требование вставить
insert into USL_FEE(.....) values (.......);
end
end

Можно поизгаляться с SQL и выправить что-то иное, но наша работа заключается в упрощении кода. Иногда я возвращаюсь к старому коду и совершенно не понимаю, как все это я написал и как все это работает. А уж разбираться в чужом - ...
...
Рейтинг: 0 / 0
Нужна помощь с модифицирующим запросом
    #38403421
genok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ooo_kontaktЖуткая постановка задачи. Я так понимаю, что разные специалисты могут выполнить один и тот же (одинаковый) объем работ, а если нет?

объем работ одинаков.
Вот квалификация у специалистов разная, соответственно разный процент с выполненной работы им платится.
Поэтому такая структура быть должна избыточная, ничего не поделаешь.
...
Рейтинг: 0 / 0
Нужна помощь с модифицирующим запросом
    #38403424
genok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в общем, пока самым негромоздким остается способ от m4m:
DELETE, а потом INSERT
...
Рейтинг: 0 / 0
Нужна помощь с модифицирующим запросом
    #38403448
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
genokодним запросом UPDATE это никак не сделать?
Можно сделать одним запросов MERGE.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Нужна помощь с модифицирующим запросом
    #38403461
genok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovgenokодним запросом UPDATE это никак не сделать?
Можно сделать одним запросов MERGE.


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

спасибо большое!
...
Рейтинг: 0 / 0
Нужна помощь с модифицирующим запросом
    #38403476
Dmitry Kurbsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
update usl_fee u3 set u3.fee=
  (select u1.fee
   from usl_fee u1
   where u1.user_id=1 and u1.usl_id=u3.usl_id)
where u3.user_id=3
...
Рейтинг: 0 / 0
Нужна помощь с модифицирующим запросом
    #38403490
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
genokDimitry Sibiryakovпропущено...

Можно сделать одним запросов MERGE.


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

спасибо большое!

Ну при некоторых допущениях можно и MERGE
а при некоторых можно и 14867189

тебе виднее что надо на самом деле
...
Рейтинг: 0 / 0
Нужна помощь с модифицирующим запросом
    #38403497
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
genok,

есть мнение, то left join в твоем запросе 14866730 нафиг не нужен.
...
Рейтинг: 0 / 0
Нужна помощь с модифицирующим запросом
    #38403931
genok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvgenok,

есть мнение, то left join в твоем запросе 14866730 нафиг не нужен.

а какой еще вариант есть такой набор данных получить?
...
Рейтинг: 0 / 0
Нужна помощь с модифицирующим запросом
    #38403944
genok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry Kurbsky
Код: sql
1.
2.
3.
4.
5.
update usl_fee u3 set u3.fee=
  (select u1.fee
   from usl_fee u1
   where u1.user_id=1 and u1.usl_id=u3.usl_id)
where u3.user_id=3



вложенный селект - вроде как не очень хорошо использовать.

у в рабочем варианте у меня получится
UPDATE .... set
P1=(SELECT....),
P2=(SELECT....),
P3=(SELECT....)
WHERE ...

не вариант, в общем
...
Рейтинг: 0 / 0
Нужна помощь с модифицирующим запросом
    #38403951
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
genok,

нафиг тебе вложенный селект делать когда merge есть
...
Рейтинг: 0 / 0
Нужна помощь с модифицирующим запросом
    #38404007
genok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисgenok,

нафиг тебе вложенный селект делать когда merge есть

вложенные селекты Dmitry Kurbsky предложил.
Сам я - за Merge, выше уже писалось про это
...
Рейтинг: 0 / 0
Нужна помощь с модифицирующим запросом
    #38404009
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
genok,

ну до версии 2.1 и во всех IB либо вложенный селект, либо через PSQL
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Нужна помощь с модифицирующим запросом
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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