powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / с update-ом приподзабыл +
25 сообщений из 30, страница 1 из 2
с update-ом приподзабыл +
    #39129361
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
теряю былую легкость :(
бд из Дейта

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
CREATE TABLE S (
  S text PRIMARY KEY CHECK (SUBSTR(S,1,1)='S')
, SNAME text
, STATUS integer
, CITY text
);
INSERT INTO "S" VALUES('S1','Smith',20,'London');
INSERT INTO "S" VALUES('S2','Jones',10,'Paris');
INSERT INTO "S" VALUES('S3','Blake',30,'Paris');
INSERT INTO "S" VALUES('S4','Clark',20,'London');
INSERT INTO "S" VALUES('S5','Adams',30,'Athens');
CREATE TABLE P (
  P text PRIMARY KEY CHECK (SUBSTR(P,1,1)='P')
, PNAME text, COLOR text
, WEIGHT real
, CITY text
);
INSERT INTO "P" VALUES('P1','Nut','Red',12.0,'London');
INSERT INTO "P" VALUES('P2','Bolt','Green',17.0,'Paris');
INSERT INTO "P" VALUES('P3','Screw','Blue',17.0,'Oslo');
INSERT INTO "P" VALUES('P4','Screw','Red',14.0,'London');
INSERT INTO "P" VALUES('P5','Cam','Blue',12.0,'Paris');
INSERT INTO "P" VALUES('P6','Cog','Red',19.0,'London');
CREATE TABLE J (
  J text PRIMARY KEY CHECK (SUBSTR(J,1,1)='J')
, JNAME text
, CITY text
);
INSERT INTO "J" VALUES('J1','Sorter','Paris');
INSERT INTO "J" VALUES('J2','Display','Rome');
INSERT INTO "J" VALUES('J3','OCR','Athens');
INSERT INTO "J" VALUES('J4','Console','Athens');
INSERT INTO "J" VALUES('J5','RAID','London');
INSERT INTO "J" VALUES('J6','EDS','Oslo');
INSERT INTO "J" VALUES('J7','Tape','London');
CREATE TABLE SPJ 	(
 S text, 
 P text, 
 J text,
 QTY integer, 
 CONSTRAINT SP_S FOREIGN KEY(S) REFERENCES S(S) ON DELETE CASCADE ON UPDATE CASCADE,
 CONSTRAINT SP_P FOREIGN KEY(P) REFERENCES P(P) ON DELETE CASCADE ON UPDATE CASCADE,
 CONSTRAINT SP_J FOREIGN KEY(J) REFERENCES J(J) ON DELETE CASCADE ON UPDATE CASCADE
);
INSERT INTO "SPJ" VALUES('S1','P1','J1',200);
INSERT INTO "SPJ" VALUES('S1','P1','J4',700);
INSERT INTO "SPJ" VALUES('S2','P3','J1',400);
INSERT INTO "SPJ" VALUES('S2','P3','J2',200);
INSERT INTO "SPJ" VALUES('S2','P3','J3',200);
INSERT INTO "SPJ" VALUES('S2','P3','J4',500);
INSERT INTO "SPJ" VALUES('S2','P3','J5',600);
INSERT INTO "SPJ" VALUES('S2','P3','J6',400);
INSERT INTO "SPJ" VALUES('S2','P3','J7',800);
INSERT INTO "SPJ" VALUES('S2','P5','J2',100);
INSERT INTO "SPJ" VALUES('S3','P3','J1',200);
INSERT INTO "SPJ" VALUES('S3','P4','J2',500);
INSERT INTO "SPJ" VALUES('S4','P6','J3',300);
INSERT INTO "SPJ" VALUES('S4','P6','J7',300);
INSERT INTO "SPJ" VALUES('S5','P2','J2',200);
INSERT INTO "SPJ" VALUES('S5','P2','J4',100);
INSERT INTO "SPJ" VALUES('S5','P5','J5',500);
INSERT INTO "SPJ" VALUES('S5','P5','J7',100);
INSERT INTO "SPJ" VALUES('S5','P6','J2',200);
INSERT INTO "SPJ" VALUES('S5','P1','J4',100);
INSERT INTO "SPJ" VALUES('S5','P3','J4',200);
INSERT INTO "SPJ" VALUES('S5','P4','J4',800);
INSERT INTO "SPJ" VALUES('S5','P5','J4',400);
INSERT INTO "SPJ" VALUES('S5','P6','J4',500);





сделал таблицу итого
Код: sql
1.
2.
3.
4.
CREATE TABLE SUM_DETAILS (
	SS text PRIMARY KEY
, DETAILS integer DEFAULT 0
);


общее количество детали от всех поставщиков по всем поставкам.

Можно записать один оператор апдейта?
Вместо этих пяти

Код: sql
1.
2.
3.
4.
5.
UPDATE "SUM_DETAILS" SET DETAILS=(SELECT SUM(QTY) FROM SPJ WHERE S='S1') WHERE SS='S1';
UPDATE "SUM_DETAILS" SET DETAILS=(SELECT SUM(QTY) FROM SPJ WHERE S='S2') WHERE SS='S2';
UPDATE "SUM_DETAILS" SET DETAILS=(SELECT SUM(QTY) FROM SPJ WHERE S='S3') WHERE SS='S3';
UPDATE "SUM_DETAILS" SET DETAILS=(SELECT SUM(QTY) FROM SPJ WHERE S='S4') WHERE SS='S4';
UPDATE "SUM_DETAILS" SET DETAILS=(SELECT SUM(QTY) FROM SPJ WHERE S='S5') WHERE SS='S5';
...
Рейтинг: 0 / 0
с update-ом приподзабыл +
    #39129368
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то такое в оракле я прокручивал с подзапросом/группировкой и связкой с внешним where.
...
Рейтинг: 0 / 0
с update-ом приподзабыл +
    #39129409
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tchingiz,
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
UPDATE "SUM_DETAILS"
   SET DETAILS = q.Sum_Qty
  FROM "SUM_DETAILS" s
       INNER JOIN ( 
               SELECT S, SUM( QTY ) Sum_Qty 
               FROM SPJ GROUP BY S 
       ) q 
       ON s.SS = q.S

как то так
...
Рейтинг: 0 / 0
с update-ом приподзабыл +
    #39129442
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно, только синтаксис UPDATE подзабыл.
SELECT такой будет
Код: sql
1.
SELECT S, SUM(QTY) FROM SPJ GROUP BY S
...
Рейтинг: 0 / 0
с update-ом приподзабыл +
    #39129472
ДохтаР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
приблизительно так....
Код: plsql
1.
2.
3.
4.
5.
6.
UPDATE "SUM_DETAILS" s1
 SET DETAILS=(SELECT SUM(QTY) FROM SPJ WHERE S=s1.SS)
where s1.SS in  (SELECT distinct S  FROM SPJ) -- чтобы null-ы  
--не сумировать для отсусвующих  в  SPJ строк, но  имеющихся  "SUM_DETAILS".
-- или делайте    внешний ключ  в SUM_DETAILS  что бы это гаранитровать декларативно.
 
...
Рейтинг: 0 / 0
с update-ом приподзабыл +
    #39129495
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychtchingiz,
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
UPDATE "SUM_DETAILS"
   SET DETAILS = q.Sum_Qty
  FROM "SUM_DETAILS" s
       INNER JOIN ( 
               SELECT S, SUM( QTY ) Sum_Qty 
               FROM SPJ GROUP BY S 
       ) q 
       ON s.SS = q.S

как то так
прямо в такой форме
апдейтится одним числом (которое первое во внутреннем запросе),


Код: plaintext
1.
2.
3.
4.
5.
6.
 -- select * from "SUM_DETAILS"
S1|900
S2|900
S3|900
S4|900
S5|900
а если добавить where

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
UPDATE "SUM_DETAILS"
SET DETAILS = 
  (
  select q.Sum_Qty--, *  
--select *
  FROM "SUM_DETAILS" s1
       INNER JOIN ( 
         SELECT S, SUM( QTY ) Sum_Qty 
         FROM SPJ GROUP BY S 
       ) q ON 
       s1.SS = q.S       
  )  
where ss = q.s


то нет колонки q.s
...
Рейтинг: 0 / 0
с update-ом приподзабыл +
    #39129519
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
версия Дохтора прошла

Код: sql
1.
2.
3.
4.
5.
6.
7.
UPDATE "SUM_DETAILS" 
   SET DETAILS=(
      SELECT SUM(QTY) 
      FROM SPJ 
      WHERE S=SS
   )
  where SS in  (SELECT distinct S  FROM SPJ)


только в апдейте нет синонимов (sqlite если что)
Код: plaintext
1.
2.
3.
4.
5.
S1|900
S2|3200
S3|700
S4|600
S5|3100
...
Рейтинг: 0 / 0
с update-ом приподзабыл +
    #39129536
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не, ошибочка есть

апд
пардон, нет
...
Рейтинг: 0 / 0
с update-ом приподзабыл +
    #39129687
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tchingizsqlite если чтопредупреждать надо )))
...
Рейтинг: 0 / 0
с update-ом приподзабыл +
    #39129899
ДохтаР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychtchingizsqlite если чтопредупреждать надо )))

По жизни нас мало предупреждают, работа такая,
и такое ORA-01427 на ровном месте
ни с того ни с сего возникает :)
...
Рейтинг: 0 / 0
с update-ом приподзабыл +
    #39130059
JDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
UPDATE sum_details t1
   SET DETAILS = (SELECT SUM(QTY) 
                    FROM SPJ t2
                   WHERE t2.s = t1.ss) 

?
...
Рейтинг: 0 / 0
с update-ом приподзабыл +
    #39130282
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychtchingizsqlite если чтопредупреждать надо )))
эта. Так на взрослом скл твоя версия тоже не очень получится?
...
Рейтинг: 0 / 0
с update-ом приподзабыл +
    #39130283
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDS
Код: sql
1.
2.
3.
4.
UPDATE sum_details t1
   SET DETAILS = (SELECT SUM(QTY) 
                    FROM SPJ t2
                   WHERE t2.s = t1.ss) 

?
??
а Дохтор не это решение написал?
...
Рейтинг: 0 / 0
с update-ом приподзабыл +
    #39130315
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tchingizэта. Так на взрослом скл твоя версия тоже не очень получится?на sql server взлетела на раз-два, я даж проверил с перепугу ))
...
Рейтинг: 0 / 0
с update-ом приподзабыл +
    #39130318
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tchingizМожно записать один оператор апдейта?А зачем тебе один апдейт?
Код: sql
1.
2.
delete from SUM_DETAILS;
insert into SUM_DETAILS select S, sum(QTY) from SPJ group by S;



Модератор:
ниче, я без разрешения поменял на SPJ?
...
Рейтинг: 0 / 0
с update-ом приподзабыл +
    #39130669
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychtchingizэта. Так на взрослом скл твоя версия тоже не очень получится?на sql server взлетела на раз-два, я даж проверил с перепугу ))
бум!
покажи результат, а то из-за этого лениво ставить чтото еще кроме sqlite.
...
Рейтинг: 0 / 0
с update-ом приподзабыл +
    #39130671
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwltchingizМожно записать один оператор апдейта?А зачем тебе один апдейт?
Код: sql
1.
2.
delete from SUM_DETAILS;
insert into SUM_DETAILS select S, sum(QTY) from SPJ group by S;


1
а это не медленее будет?

2
ну, я так и рассказываю.
Сначала Исаак родил Иакова делаете вью с "select S, sum(QTY) from SP group by S;"
Потом, через 5 лет, склад разросся и Вы поутру перед приходом начальников делаете
Код: sql
1.
2.
delete from SUM_DETAILS;
insert into SUM_DETAILS select S, sum(QTY) from SPJ group by S;


Потом (еще через года три) задалбываетесь ждать и делаете
Код: sql
1.
2.
3.
4.
5.
6.
7.
insert into sum_details 
   select s, 0 
   from s 
   where s not in 
       (select ss 
        from sum_details
       )


и
Код: sql
1.
2.
3.
4.
UPDATE sum_details t1
   SET DETAILS = (SELECT SUM(QTY) 
                    FROM SPJ t2
                   WHERE t2.s = t1.ss) 




а потом (еще через года 3) переходите к триггерам.
...
Рейтинг: 0 / 0
с update-ом приподзабыл +
    #39130678
JDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tchingizа потом (еще через года 3) переходите к триггерам
А еще через три года выбрасываете триггера и переходите к, если так можно выразиться, интерфейсным функциям )
...
Рейтинг: 0 / 0
с update-ом приподзабыл +
    #39130682
JDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ну можно еще перед этим мат.вью попробовать )
...
Рейтинг: 0 / 0
с update-ом приподзабыл +
    #39130685
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tchingizWhite Owlпропущено...
А зачем тебе один апдейт?
Код: sql
1.
2.
delete from SUM_DETAILS;
insert into SUM_DETAILS select S, sum(QTY) from SP group by S;


1
а это не медленее будет?
Быстрее. Т.к. не надо никаких поисков где заменять.
Но такой подход не применим если используется ссылочная целостность. Как правило она используется.
...
Рейтинг: 0 / 0
с update-ом приподзабыл +
    #39130706
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,
а гроупБай?
...
Рейтинг: 0 / 0
с update-ом приподзабыл +
    #39130724
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T[
Но такой подход не применим если используется ссылочная целостность. Как правило она используется.
В реальности в таблице транзакций (SPJ) еще будут даты
надо обновлять только тех, у кого были транзакции за последний день - а это уже точно
быстрее.
Какую ссылочную целостность ты имеешь ввиду?
Внешние ключи из sum_details поле ss на таблицу S поле s, явно не помешает.
...
Рейтинг: 0 / 0
с update-ом приподзабыл +
    #39130747
ДохтаР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tchingizDima T[
Но такой подход не применим если используется ссылочная целостность. Как правило она используется.
В реальности в таблице транзакций (SPJ) еще будут даты
надо обновлять только тех, у кого были транзакции за последний день - а это уже точно
быстрее.
Какую ссылочную целостность ты имеешь ввиду?
Внешние ключи из sum_details поле ss на таблицу S поле s, явно не помешает.

Тогда вам в SUM_DETAILS нужны даты начала и конца периодов сумирования.
Иначе склад точно разорится с таким учетом :)
...
Рейтинг: 0 / 0
с update-ом приподзабыл +
    #39130754
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tchingizDima T,
а гроупБай?
Хуже если его нет, значит есть куча селектов.
...
Рейтинг: 0 / 0
с update-ом приподзабыл +
    #39130760
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TtchingizDima T,
а гроупБай?
Хуже если его нет, значит есть куча селектов.
ну, а ты сказал что это быстрее

Код: plaintext
1.
2.
3.
4.
5.
delete from SUM_DETAILS;
insert into SUM_DETAILS select S, sum(QTY) from SPJ  

          group by S;

...
Рейтинг: 0 / 0
25 сообщений из 30, страница 1 из 2
Форумы / Программирование [игнор отключен] [закрыт для гостей] / с update-ом приподзабыл +
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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