![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Конструкция UPDATE&SELECT [D5, dBase, FoxPro]
Hawk2 © (2003-06-06 10:37:00)Подскажите возможно ли использовать конструкцию UPDATE&SELECT. Суть в следующем: есть две таблицы Table1 (ID, FIRST_SUMMA, SECOND_SUMMA) и Table2 (ID, TEMP_SUMMA).
Table1 Table2
ID FIRST_SUMMA SECOND_SUMMA ID TEMP_SUMMA
1 12.80 0 1 100.24
2 100.40 0 2 425.00
3 60.20 0 3 15.16
4 180.20 0 4 248.19
Нужно в Table1 в поле SECOND_SUMMA внести значения поля TEMP_SUMMA соответственно Table1.ID=Table2.ID
Hawk2 (2003-06-06 18:17:00) [1]Рабочий день закончился и все разошлись, пора и самому отдохнуть, может на свежую голову найдется другое решение. А всем кто помогал ОГРОМНОЕ СПАСИБО!!!
Hawk2 (2003-06-06 17:54:00) [2]То bushmen © (06.06.03 16:13)> У меня твой запрос отлично работает. Никаких ошибок.
У меня тоже заработал.
Ребята извините что немного путал вас, но я думал разобраться на простом, а потом переходить к сложному, но как я понял нужно объяснить все как есть. Вобщим как я говорил исходные таблицы не мои и приходится извращатся как только можно, чтобы использовать поменьше промежуточных таблиц. Принцим вот такой. Есть первая исходная таблица Working (ID, SKOD, DOLG, NACHISL, OPLATA есть и др. поля которые для меня не нужны) в этой таблице хранятся: счета абонентов, коды услуг, долг, начисление, оплата. Может быть несколько записей с одинаковым ID. Есть вторая таблица Abonents (ID, FIO, RAYON и как и в первой куча др. полей) в этой таблице хранятся: счета абонентов (как в первой, но тут счета не повторяются, поле ID уникально), фамилии абонентов, номер района в котором он живет. Значение в поле RAYON повторяется так как куча абонентов могут жить в одном районе. Есть третья таблица Rayony (RNOMER, RNAME) тут храниться номер района (значение уникально) и название района.
Задача в том чтобы подсчитать дебет. задолж. всех абонентов сумарно по каждому району.
Пошагово это выглядит так: подсчитываем ДЗ по каждому абоненту и групируем по их счетам
INSERT INTO TEMPTable1
SELECT ID, DOLG+NACHISL-OPLATA AS DEBET
FROM WORKING
WHERE SKOD IN ("43", "45", "47")
GROUP BY ID
Получится таблица TEMPTable1(ID, DEBET) с згруппироваными счетами абонентов.
Поскольку в таблице WORKING нет номеров районов приходится использовать таблицу ABONENTS как промежуточную для свьязи WORKING с таблицей RAYON и результатом этого запроса проапдейтить конечную таблицу SVOD (RID, NACHISL, DEBET) в которой уже есть номера районов и общие суммы начислений по этих районах:
UPDATE SVOD s1 SET s1.DEBET=(
SELECT SUM(t1.DEBET)
FROM TEMPTable1 t1 INNER JOIN ABONENTS a1 ON t1.ID=a1.ID
INNER JOIN RAYONY r1 ON a1.RAYON=r1.NRAYON
WHERE DEBET>=0 отбрасываем кредиторов (суммы с минусом)
AND s1.RID=r1.NRAYON
GROUP BY r1.NRAYON)
Вот тут и не получается, пишет что подзапрос выдает более одного поля. Приходится использовать еще одну временную таблицу, а уже из нее апдейтить SVOD. Или это можно вообще както по-другому организовать?
Сколько написал что незнаю разбирет ли кто чего нужно сделать.
bushmen (2003-06-06 16:31:00) [3]To Sandman25 ©:
Ты прав - твой метод по-экономичнее
Sandman25 (2003-06-06 16:23:00) [4]bushmen © (06.06.03 16:17)
Разве? У меня работает...
bushmen (2003-06-06 16:17:00) [5]To Sandman25 ©:
Если у него несколько строк с одним ID, то не будет суммирования!
Sandman25 (2003-06-06 16:15:00) [6]UPDATE Table1 SET SECOND_SUMMA=(
SELECT SUM(TEMP_SUMMA) FROM TABLE2 WHERE TABLE1.ID=TABLE2.ID)
Без GROUP BY!
bushmen (2003-06-06 16:13:00) [7]To Hawk2:
Это уже лучше. У меня твой запрос отлично работает. Никаких ошибок.
Johnmen (2003-06-06 16:11:00) [8]Группировка здесь совершенно непричем ! Более того, даст неверный результат.
>Это в том случае если в Table2 записей с одинаковым ID несколько.
И какая же из них "должна попасть" в T1 ???
Hawk2 (2003-06-06 16:01:00) [9]To bushmen © (06.06.03 15:43)>У тебя тут неоднозначность. Зачем группировка?
Это в том случае если в Table2 записей с одинаковым ID несколько.
To Zacho © (06.06.03 15:53)
Торопился, не доглядел нужно:
UPDATE Table1 SET SECOND_SUMMA=(
SELECT SUM(TEMP_SUMMA)FROM TABLE2 WHERE TABLE1.ID=TABLE2.ID
GROUP BY TABLE2.ID)
To MsGuns © (06.06.03 15:52)
Щас попробую!
Zacho (2003-06-06 15:53:00) [10]
> Hawk2 (06.06.03 15:35)
Выкини GROUP BY. GROUP BY используется толькодля агрегирования. А где в твоем запросе агрегатные функции.
И смотри Sergey13 © (06.06.03 11:02)
MsGuns (2003-06-06 15:52:00) [11]UPDATE Table1
SET Fld1=
(Select Flxxx from Table2
Where ...),
Fld2=
(Select Flyyy from Table2
Where ...),
Fld3=
(Select Flzzz from Table2
Where ...)
....
Условия, если редактирование "один-в-один" должны повторяться.
bushmen (2003-06-06 15:43:00) [12]У тебя тут неоднозначность. Зачем группировка?
Hawk2 (2003-06-06 15:35:00) [13]А как правильно выполнить вот такой запрос:
UPDATE Table1 SET SECOND_SUMMA=(
SELECT TEMP_SUMMA FROM TABLE2 WHERE TABLE1.ID=TABLE2.ID
GROUP BY TABLE2.ID)
здесь пишет что подзапрос возвращает больше одного столбца, а как сделать чтобы было правильно?
Hawk2 (2003-06-06 11:52:00) [14]Дело в том что эти таблицы какбы временные, которые формируются из исходной. Формируются они как результпт запросов, но запросов разных (один на выборку начисления, а другой на выборку дебиторской задолжености), а в результпте я хочу получить одну таблицу (конечную например ID, DEBET1, NACHISL1, DEBET2, NACHISL2, DEBET3, NACHISL3) иначе будет 6 таблиц. Причем и дебет и начисление в каждом случае считаются по-разному и сделать например две таблицы (ID, DEBET1, DEBET2, DEBET3 и ID, NACHISL1, NACHISL2, NACHISL3) тоже не получится. И еще, исходная таблица не моя, она создана для другой программы, которая с ней работает, а мне нужно сделать с нее отчет, поэтому приходится "плясать" от чего есть.
Sergey13 (2003-06-06 11:02:00) [15]2Hawk2 (06.06.03 10:37)
Если в 2 таблице гарантировано не более 1записи с одинаковым ID то Zacho © (06.06.03 10:41) иначе будет возможна ошибка. Но тогда вопрос - а зачем вторая таблица? Не проще ли будет добавить поле TEMP_SUMMA в 1 таблицу?
Zacho (2003-06-06 10:41:00) [16]UPDATE TABLE1 SET SECOND_SUMMA=(SELECT TEMP_SUMMA FROM TABLE2 WHERE TABLE1.ID=TABLE2.ID)