PDA

Просмотр полной версии : Запрос на обновление записи



Dr_Grizzly
29.01.2008, 13:09
Всем привет! Такая вот ситуация, есть две таблицы:
Tab1
key,FIO,ADRES,SUM

Tab2
fiokey,Name,kol,sum

Делаю запрос

Select sum(tab2.sum) from tab1,tab2 where key=fiokey
Group by tab1.fio

Показывает четкую таблицу суммам покупок. А теперь бы сделать так чтоб она посчитала сумму покупок у ФИО и записала результат в поле tab1.sum. Такое можно реализовать или я брежу уже? ))))

Владимир
29.01.2008, 15:42
Предлагаю такой вариант


UPDATE tab1
SET tab1.sum = SubQ.Sum_purch
FROM
(SELECT t1.fio as Fio, sum(t2.sum) AS Sum_purch
FROM tab1 AS t1 JOIN tab2 AS t2 ON t1.key=t2.fiokey
GROUP BY t1.fio) AS SubQ
WHERE tab1.fio = SubQ.Fio

Dr_Grizzly
31.01.2008, 19:12
SubQ.Sum_purch - а это что за табличка? она временная? или это там результат будет?

Serge_Bliznykov
31.01.2008, 21:55
возьму на себя наглость ответить..

Dr_Grizzly,
SubQ.Sum_pu
нет. Я бы очень рекомендовал Вам ознакомиться с любым мануалом по SQL (Structured Query Language)... Особено с разделом "подзапросы" (они же "вложенные" запросы)...
Дело в том, что "AS SubQ" - as - означает "как" (или, если понятнее "именовать так") так именуется внутренный подзапрос, в котором выбираются два поля - Fio и Sum_purch (обратите внимания на ключевое слово AS) во внутреннем запросе записи группируются по фамилиям, и по каждой фамилии считается сумма из таблицы T2...
Дальше всё понятно?

Dr_Grizzly
04.02.2008, 08:57
Воо-ооо! Теперь ясненько! Спасибо!

Dr_Grizzly
04.02.2008, 09:35
Блин, то ли я туплю, то ли лыжи не едут, пишет: Ошибка синтаксиса (пропущен оператор) в выражении запроса 'SubQ.Sum_purch FROM
(SELECT t1.fio as Fio, sum(t2.sum) AS Sum_purch
FROM tab1 AS t1 JOIN tab2 AS t2 ON t1.key=t2.fiokey
GROUP BY t1.fio) AS SubQ'

Владимир
04.02.2008, 10:50
Я думаю, что дело в следующем: ты в названии полей таблицы используешь служебные слова sum, key. Заключи их в квадратные скобки(sum(t2.[sum] и t1.[key])) и все долджно быть ОК. На будущее, не называй поля именами пересекающимися со служебными словами.

Игорь Акопян
04.02.2008, 13:20
так, в порядке любопытства... Что за сервер то?

Dr_Grizzly
04.02.2008, 14:40
Гы :) это в Дельфе компонент Adoquery, у него строю sql запрос :)

А ошибка не пропала, все так же ругается на тоже самое, только теперь рисует t1.[key]

Владимир
04.02.2008, 16:13
Игорь Акопян интересовался к какому серверу БД происходит обращение: MS SQL, Oracle, DB2, MySQL и т.п. Почти каждый сервер БД имеет свой диалект языка SQL. Я приводил примеры исходя из Transact-SQL(MS SQL).

Dr_Grizzly
05.02.2008, 07:27
тогда MS SQL :) - это мелкософтный sql?

Игорь Акопян
05.02.2008, 15:12
Владимир, я конечно не гуру по SQL, но запрос такого вида пройдёт в оракле и не пройдёт в FB в версии ниже 2.0 (кажется). С остальными не знаком... :)

Dr_Grizzly
17.03.2008, 11:06
Привет снова! Я все еще мучаюсь с этим запросом...

Если я строю этот запрос -

SELECT t1.fio as Fio, sum(t2.sum) AS Sum_purch
FROM tab1 AS t1 JOIN tab2 AS t2 ON t1.key=t2.fiokey
GROUP BY t1.fio

Он должен работать???? Т.к. мне ща ругается что "Ошибка синтаксеса в предложении FROM"

Yurich
17.03.2008, 12:05
У тебя не указан тип join'а (inner join, left outer, right outer). Поэтому и ругается...

Владимир
17.03.2008, 12:54
У меня в данном варианте синтаксиса

SELECT t1.fio as Fio, sum(t2.sum) AS Sum_purch
FROM tab1 AS t1 JOIN tab2 AS t2 ON t1.key=t2.fiokey
GROUP BY t1.fio
выдается ошибка "Incorrect syntax near the keyword 'key'."

Лечится это следующим образом

SELECT t1.fio as Fio, sum(t2.sum) AS Sum_purch
FROM tab1 AS t1 JOIN tab2 AS t2 ON t1.[key]=t2.fiokey
GROUP BY t1.fio

Dr_Grizzly
20.03.2008, 08:21
Совместил и то и другое и проблема исчезла. Это результат

SELECT t1.nomerkred as kred, t1.datakred as dat, sum(nachfed) AS Sum_purch
FROM kreditname AS t1 RIGHT JOIN finanskred AS t2 ON t1.[key]=t2.kredkey
GROUP BY t1.nomerkred, t1.datakred

Теперь когда впихиваю это в запрос на обновление, она мне ругается на ошибку синтаксиса (пропущен оператор), начиная с "subq.Sum_purch From (... ) as SubQ"

Update kreditname
set kreditname.itogonachfed = subq.Sum_purch
From
(SELECT t1.nomerkred as kred, t1.datakred as dat, sum(nachfed) AS Sum_purch
FROM kreditname AS t1 RIGHT JOIN finanskred AS t2 ON t1.[key]=t2.kredkey
GROUP BY t1.nomerkred, t1.datakred) as SubQ
WHERE kreditname.nomerkred = SubQ.kred and kreditname.datakred=subq.dat

Игорь Акопян
20.03.2008, 10:57
update ... set ... where
select ... from ... where

update ... set ... from - неправильно

Dr_Grizzly
20.03.2008, 18:33
фихня какая-та получается %) и как же тут сделать вложенный запрос???

Игорь Акопян
21.03.2008, 10:02
я бы процедуру написал...

Владимир
21.03.2008, 11:36
update ... set ... where
select ... from ... where

update ... set ... from - неправильно

Это почему же update ... set ... from - неправильно??? Очень даже правильно, а Dr_Grizzly скорее всего перепутал типы соединения, ему не LEFT или RIGHT, а INNER нужно

Игорь Акопян
21.03.2008, 14:52
на сколько я помню в SQL92 такого нет... ;)

Владимир
21.03.2008, 15:18
на сколько я помню в SQL92 такого нет... ;)

Ну во-первых как минимум есть SQL99 :) (хотя там этого тоже вроде нет), а во-торых, насколько я помню, Dr_Grizzly ваяет на Transact-SQL от MS, а там это разрешено

Dr_Grizzly
21.03.2008, 20:02
По поводу того где я вояю, вояю я в Делфе 6, компонента ADOQuery, я проверил, язык один в один с языком который в MS Access, когда там строишь запросы...

Этот же запрос я кидаю в аксес и та же самая ошибка...

Inner тоже не канает :) та же самая ошибка на том же месте :)

Dr_Grizzly
21.03.2008, 20:04
Конечно, можно написать обычную процедуру, которая просто будет листать все записи и считать и обновлять поля.... Но это же ооооооооочень мееееееедленннннаая процедура с таким количеством записей, вот и хочется это на SQL возложить... ;)