Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.011 c
14-97819
Andrey007
2003-06-11 10:23
2003.06.30
Вопрос по круглому кольцу.


14-97881
Sergey13
2003-06-11 08:58
2003.06.30
Завтра отпуск. Чего бы еще сделать?


6-97762
HAMEL1ON
2003-04-25 02:30
2003.06.30
много потоков в TClientSocket


14-97829
Alex_x
2003-06-11 15:51
2003.06.30
неменяется значение RadioButton


6-97768
wQH
2003-04-24 08:28
2003.06.30
TIdDNSresolver





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский