Форум: "Базы";
Текущий архив: 2003.06.30;
Скачать: [xml.tar.bz2];
ВнизКонструкция UPDATE&SELECT Найти похожие ветки
← →
Hawk2 (2003-06-06 10:37) [0]Подскажите возможно ли использовать конструкцию 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
← →
Zacho (2003-06-06 10:41) [1]UPDATE TABLE1 SET SECOND_SUMMA=(SELECT TEMP_SUMMA FROM TABLE2 WHERE TABLE1.ID=TABLE2.ID)
← →
Sergey13 (2003-06-06 11:02) [2]2Hawk2 (06.06.03 10:37)
Если в 2 таблице гарантировано не более 1 записи с одинаковым ID то Zacho © (06.06.03 10:41) иначе будет возможна ошибка. Но тогда вопрос - а зачем вторая таблица? Не проще ли будет добавить поле TEMP_SUMMA в 1 таблицу?
← →
Hawk2 (2003-06-06 11:52) [3]Дело в том что эти таблицы какбы временные, которые формируются из исходной. Формируются они как результпт запросов, но запросов разных (один на выборку начисления, а другой на выборку дебиторской задолжености), а в результпте я хочу получить одну таблицу (конечную например ID, DEBET1, NACHISL1, DEBET2, NACHISL2, DEBET3, NACHISL3) иначе будет 6 таблиц. Причем и дебет и начисление в каждом случае считаются по-разному и сделать например две таблицы (ID, DEBET1, DEBET2, DEBET3 и ID, NACHISL1, NACHISL2, NACHISL3) тоже не получится. И еще, исходная таблица не моя, она создана для другой программы, которая с ней работает, а мне нужно сделать с нее отчет, поэтому приходится "плясать" от чего есть.
← →
Hawk2 (2003-06-06 15:35) [4]А как правильно выполнить вот такой запрос:
UPDATE Table1 SET SECOND_SUMMA=(
SELECT TEMP_SUMMA FROM TABLE2 WHERE TABLE1.ID=TABLE2.ID
GROUP BY TABLE2.ID)
здесь пишет что подзапрос возвращает больше одного столбца, а как сделать чтобы было правильно?
← →
bushmen (2003-06-06 15:43) [5]У тебя тут неоднозначность. Зачем группировка?
← →
MsGuns (2003-06-06 15:52) [6]UPDATE Table1
SET Fld1=
(Select Flxxx from Table2
Where ...),
Fld2=
(Select Flyyy from Table2
Where ...),
Fld3=
(Select Flzzz from Table2
Where ...)
....
Условия, если редактирование "один-в-один" должны повторяться.
← →
Zacho (2003-06-06 15:53) [7]
> Hawk2 (06.06.03 15:35)
Выкини GROUP BY. GROUP BY используется только для агрегирования. А где в твоем запросе агрегатные функции.
И смотри Sergey13 © (06.06.03 11:02)
← →
Hawk2 (2003-06-06 16:01) [8]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)
Щас попробую!
← →
Johnmen (2003-06-06 16:11) [9]Группировка здесь совершенно непричем ! Более того, даст неверный результат.
>Это в том случае если в Table2 записей с одинаковым ID несколько.
И какая же из них "должна попасть" в T1 ???
← →
bushmen (2003-06-06 16:13) [10]To Hawk2:
Это уже лучше. У меня твой запрос отлично работает. Никаких ошибок.
← →
Sandman25 (2003-06-06 16:15) [11]UPDATE Table1 SET SECOND_SUMMA=(
SELECT SUM(TEMP_SUMMA) FROM TABLE2 WHERE TABLE1.ID=TABLE2.ID)
Без GROUP BY!
← →
bushmen (2003-06-06 16:17) [12]To Sandman25 ©:
Если у него несколько строк с одним ID, то не будет суммирования!
← →
Sandman25 (2003-06-06 16:23) [13]bushmen © (06.06.03 16:17)
Разве? У меня работает...
← →
bushmen (2003-06-06 16:31) [14]To Sandman25 ©:
Ты прав - твой метод по-экономичнее
← →
Hawk2 (2003-06-06 17:54) [15]То 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. Или это можно вообще както по-другому организовать?
Сколько написал что незнаю разбирет ли кто чего нужно сделать.
← →
Hawk2 (2003-06-06 18:17) [16]Рабочий день закончился и все разошлись, пора и самому отдохнуть, может на свежую голову найдется другое решение. А всем кто помогал ОГРОМНОЕ СПАСИБО!!!
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.06.30;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.008 c