Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.06.30;
Скачать: CL | DM;

Вниз

Конструкция 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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.023 c
3-97515
AkaSaint
2003-06-02 00:28
2003.06.30
Странное с ClientDataSet


7-97894
ИгорьШШШ
2003-04-21 09:18
2003.06.30
Вход пользователя


1-97644
e}{e
2003-06-19 01:31
2003.06.30
ошибка времени выполнения 105


1-97720
QUE
2003-06-18 14:00
2003.06.30
Как избавиться от пунктирных линий при отрисовке ячеек StringGrid


14-97816
Jumper
2003-06-11 16:33
2003.06.30
Где можно скачать Delphi 3.0