powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / с update-ом приподзабыл +
5 сообщений из 30, страница 2 из 2
с update-ом приподзабыл +
    #39130786
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tchingizDima T[
Но такой подход не применим если используется ссылочная целостность. Как правило она используется.
В реальности в таблице транзакций (SPJ) еще будут даты
надо обновлять только тех, у кого были транзакции за последний день - а это уже точно
быстрее.
Какую ссылочную целостность ты имеешь ввиду?
Внешние ключи из sum_details поле ss на таблицу S поле s, явно не помешает.
Удалять все не обязательно.
Есть два способа обновить данные:
1. UPDATE
2. DELETE + INSERT
у каждого есть плюсы и минусы. Например UPDATE не обновить запись которой нет, т.е. надо предварительно ее наличие проверить и сделать INSERT, т.е. реально в коде это выливается в if(SELECT) {UPDATE} else {INSERT} для одной записи, в случае набора записей задача усложняется. Во втором случае DELETE не даст удалить запись на которую есть ссылки.
...
Рейтинг: 0 / 0
с update-ом приподзабыл +
    #39130811
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tchingizDima Tпропущено...

Хуже если его нет, значит есть куча селектов.
ну, а ты сказал что это быстрее

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

          group by S;


чем тебя group by пугает? Это дополнение к sum()

Я имел ввиду быстрее чем
Код: sql
1.
2.
3.
4.
UPDATE sum_details t1
   SET DETAILS = (SELECT SUM(QTY) 
                    FROM SPJ t2
                   WHERE t2.s = t1.ss) 


который в реале может быть выполнен так
Код: 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';


а может быть так
Код: 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-ом приподзабыл +
    #39131359
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tchingizбум!
покажи результат, а то из-за этого лениво ставить чтото еще кроме sqlite.держи
Код: 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.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
USE tempdb
GO
CREATE TABLE S (
  S VARCHAR( 3 ) PRIMARY KEY CHECK (SUBSTRING(S,1,1)='S')
, SNAME VARCHAR( 50 )
, STATUS integer
, CITY VARCHAR( 50 )
);
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 VARCHAR( 3 ) PRIMARY KEY CHECK (SUBSTRING(P,1,1)='P')
, PNAME VARCHAR( 50 )
, COLOR VARCHAR( 50 )
, WEIGHT real
, CITY VARCHAR( 50 )
);
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 VARCHAR( 3 ) PRIMARY KEY CHECK (SUBSTRING(J,1,1)='J')
, JNAME VARCHAR( 50 )
, CITY VARCHAR( 50 )
);
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 VARCHAR( 3 ), 
 P VARCHAR( 3 ), 
 J VARCHAR( 3 ),
 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);

CREATE TABLE SUM_DETAILS (
	SS VARCHAR( 3 ) PRIMARY KEY
, DETAILS integer DEFAULT 0
);
INSERT INTO SUM_DETAILS ( SS ) 
SELECT S FROM [S];
GO 


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SELECT * FROM SUM_DETAILS;

UPDATE [SUM_DETAILS]
   SET DETAILS = q.Sum_Qty
  FROM [SUM_DETAILS] sd
       INNER JOIN ( 
               SELECT S, SUM( QTY ) Sum_Qty 
               FROM SPJ GROUP BY S 
       ) q 
       ON sd.SS = q.S;
       
SELECT * FROM SUM_DETAILS
GO


Код: plaintext
1.
2.
3.
4.
5.
SS	DETAILS
S1	0
S2	0
S3	0
S4	0
S5	0

Код: plaintext
(5 row(s) affected)

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

аааа, все понятно, я в спешке испортил твою версию

у тебя было
Код: plaintext
1.
 SET DETAILS = q.Sum_Qty
  FROM "SUM_DETAILS" s

а я написал

Код: plaintext
1.
2.
3.
 SET DETAILS = ( select q.Sum_Qty
                         FROM "SUM_DETAILS" s
....
                        )

в sqlite
после set есть только фраза where
...
Рейтинг: 0 / 0
с update-ом приподзабыл +
    #39131421
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tchingizegorych,
аааа, все понятно, я в спешке испортил твою версиюфу, какой ты фулюган ))) sqlite оправдан, таким образом, зато )))
...
Рейтинг: 0 / 0
5 сообщений из 30, страница 2 из 2
Форумы / Программирование [игнор отключен] [закрыт для гостей] / с update-ом приподзабыл +
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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