Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / с update-ом приподзабыл + / 25 сообщений из 30, страница 1 из 2
16.12.2015, 09:32
    #39129361
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
с update-ом приподзабыл +
теряю былую легкость :(
бд из Дейта

Код: 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
16.12.2015, 09:39
    #39129368
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
с update-ом приподзабыл +
Что-то такое в оракле я прокручивал с подзапросом/группировкой и связкой с внешним where.
...
Рейтинг: 0 / 0
16.12.2015, 10:20
    #39129409
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
с update-ом приподзабыл +
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
16.12.2015, 10:47
    #39129442
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
с update-ом приподзабыл +
Можно, только синтаксис UPDATE подзабыл.
SELECT такой будет
Код: sql
1.
SELECT S, SUM(QTY) FROM SPJ GROUP BY S
...
Рейтинг: 0 / 0
16.12.2015, 11:03
    #39129472
ДохтаР
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
с update-ом приподзабыл +
приблизительно так....
Код: 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
16.12.2015, 11:16
    #39129495
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
с update-ом приподзабыл +
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
16.12.2015, 11:27
    #39129519
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
с update-ом приподзабыл +
версия Дохтора прошла

Код: 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
16.12.2015, 11:39
    #39129536
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
с update-ом приподзабыл +
не, ошибочка есть

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

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

?
...
Рейтинг: 0 / 0
16.12.2015, 23:44
    #39130282
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
с update-ом приподзабыл +
egorychtchingizsqlite если чтопредупреждать надо )))
эта. Так на взрослом скл твоя версия тоже не очень получится?
...
Рейтинг: 0 / 0
16.12.2015, 23:45
    #39130283
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
с update-ом приподзабыл +
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
17.12.2015, 00:25
    #39130315
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
с update-ом приподзабыл +
tchingizэта. Так на взрослом скл твоя версия тоже не очень получится?на sql server взлетела на раз-два, я даж проверил с перепугу ))
...
Рейтинг: 0 / 0
17.12.2015, 00:31
    #39130318
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
с update-ом приподзабыл +
tchingizМожно записать один оператор апдейта?А зачем тебе один апдейт?
Код: sql
1.
2.
delete from SUM_DETAILS;
insert into SUM_DETAILS select S, sum(QTY) from SPJ group by S;



Модератор:
ниче, я без разрешения поменял на SPJ?
...
Рейтинг: 0 / 0
17.12.2015, 12:36
    #39130669
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
с update-ом приподзабыл +
egorychtchingizэта. Так на взрослом скл твоя версия тоже не очень получится?на sql server взлетела на раз-два, я даж проверил с перепугу ))
бум!
покажи результат, а то из-за этого лениво ставить чтото еще кроме sqlite.
...
Рейтинг: 0 / 0
17.12.2015, 12:43
    #39130671
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
с update-ом приподзабыл +
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
17.12.2015, 12:49
    #39130678
JDS
JDS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
с update-ом приподзабыл +
tchingizа потом (еще через года 3) переходите к триггерам
А еще через три года выбрасываете триггера и переходите к, если так можно выразиться, интерфейсным функциям )
...
Рейтинг: 0 / 0
17.12.2015, 12:51
    #39130682
JDS
JDS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
с update-ом приподзабыл +
А ну можно еще перед этим мат.вью попробовать )
...
Рейтинг: 0 / 0
17.12.2015, 12:54
    #39130685
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
с update-ом приподзабыл +
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
17.12.2015, 13:08
    #39130706
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
с update-ом приподзабыл +
Dima T,
а гроупБай?
...
Рейтинг: 0 / 0
17.12.2015, 13:16
    #39130724
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
с update-ом приподзабыл +
Dima T[
Но такой подход не применим если используется ссылочная целостность. Как правило она используется.
В реальности в таблице транзакций (SPJ) еще будут даты
надо обновлять только тех, у кого были транзакции за последний день - а это уже точно
быстрее.
Какую ссылочную целостность ты имеешь ввиду?
Внешние ключи из sum_details поле ss на таблицу S поле s, явно не помешает.
...
Рейтинг: 0 / 0
17.12.2015, 13:28
    #39130747
ДохтаР
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
с update-ом приподзабыл +
tchingizDima T[
Но такой подход не применим если используется ссылочная целостность. Как правило она используется.
В реальности в таблице транзакций (SPJ) еще будут даты
надо обновлять только тех, у кого были транзакции за последний день - а это уже точно
быстрее.
Какую ссылочную целостность ты имеешь ввиду?
Внешние ключи из sum_details поле ss на таблицу S поле s, явно не помешает.

Тогда вам в SUM_DETAILS нужны даты начала и конца периодов сумирования.
Иначе склад точно разорится с таким учетом :)
...
Рейтинг: 0 / 0
17.12.2015, 13:33
    #39130754
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
с update-ом приподзабыл +
tchingizDima T,
а гроупБай?
Хуже если его нет, значит есть куча селектов.
...
Рейтинг: 0 / 0
17.12.2015, 13:35
    #39130760
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
с update-ом приподзабыл +
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
Форумы / Программирование [игнор отключен] [закрыт для гостей] / с update-ом приподзабыл + / 25 сообщений из 30, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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