Старый 27.09.2005, 15:53   #1   
Форумец
 
Аватар для Billingist
 
Сообщений: 321
Регистрация: 26.09.2005
Возраст: 40

Billingist вне форума Не в сети
Использование Update

Возможно ли в Update в качестве выражения использовать запрос?

Result - это результирующая таблица в полях CComp и NameComp есть записи
в поле InvAbon пустое нужно чтобы оно заполнилось данными из таблицы efir
Вот текст запроса:

UPDATE Result SET InvAbon = (
SELECT Sum(efir.SDR)
FROM Result LEFT JOIN efir ON Result.CComp=efir.OperatorCode
GROUP BY Result.CComp, Result.NameComp);
  Ответить с цитированием
Старый 28.09.2005, 06:59   #2   
Форумец
 
Аватар для zss_vrn
 
Сообщений: 2,045
Регистрация: 27.08.2003

zss_vrn вне форума Не в сети
А какая СУБД?
В Oracle можно.
  Ответить с цитированием
Старый 28.09.2005, 09:00   #3   
Форумец
 
Аватар для Billingist
 
Сообщений: 321
Регистрация: 26.09.2005
Возраст: 40

Billingist вне форума Не в сети
Access при таком запросе выдает сообщение "В операции должен использоваться обновляемый запрос" И естественно не модифицирует записи
  Ответить с цитированием
Старый 28.09.2005, 10:11   #4   
Бывалый форумец
 
Аватар для J++
 
Сообщений: 687
Регистрация: 05.08.2005

J++ вне форума Не в сети
Не знаю точно насчет Access.
Общие соображения:
Если я смысл твоего запроса правильно поняла, то в нашей DB2 это бы выглядело примерно так (да и по-моему в стандартном SQL не отличается):

UPDATE Result r SET r.InvAbon =
(SELECT Sum(e.SDR) FROM Result r1
LEFT JOIN efir e ON r1.CComp=e.OperatorCode
WHERE r1.CComp=r.CComp and r1.NameComp=r.NameComp
);

чем отличается от твоего запроса:
Такой запрос _гарантирует_, что если у тебя CComp в Result - уникально, то в результате select получился либо ОДНА запись в наборе, либо НИ ОДНОЙ (тогда тебе придет null -значение. Если у тебя в поле InvAbon null запрещен, или нет автоматического преобразования в 0, или ты вручную не преобразуешь в 0, то БД будет ругаться).

А смысл получается, кажется, правильный: для каждого суммирования выбираются только те записи, которые соответствуют текущему CComp.

К тому же, если у тебя CComp - уникально, то в WHERE можно не писать "and r1.NameComp=r.NameComp" .


В твоем же запросе у меня нет уверенности в том, что придет именно ОДНА запись как результат select. Потому что у тебя там не WHERE, а GROUP BY, который (в зависимости от данных) может спокойно вернуть НАБОР записей - суммы, соответствующие КАЖДОМУ CComp. НАБОР записей в ОДНО поле, конечно, впихнуть невозможно - база тебе скажет все что о тебе думает
  Ответить с цитированием
Старый 28.09.2005, 15:31   #5   
Форумец
 
Аватар для Billingist
 
Сообщений: 321
Регистрация: 26.09.2005
Возраст: 40

Billingist вне форума Не в сети
Естественно CComp уникально- это во-первых.
Из этого следует, что оба варианта запроса дожны возвращать один и тот же результат.
Во-вторых, не работает ни так ни так.
Расскажу подробнее: Есть таблица Result(Comp, CompName, InvComp, InvAbon) она пустая, ключевое поле CComp.
В эту таблицу вставляются записи из таблиц Company и ttf следующим запросом:

INSERT INTO RESULT ( CComp, NameComp, InvComp )
SELECT COMPANY.OperatorCode, COMPANY.OperatorName, Sum(ttf.CostCCC)
FROM COMPANY LEFT JOIN ttf ON COMPANY.OperatorCode=ttf.OperatorCode
WHERE (Company.DateEnd Is Null) And Company.OperatorCode Not In ('CCC')
GROUP BY COMPANY.OperatorCode, COMPANY.OperatorName;

Соответственно записи в поле InvAbon примут значение null

Все нормально вставляется...

Теперь необходимо заполнить поле InvAbon. Записи берутся из другой таблицы efir
Это я как раз пытаюсь сделать вот этим запросом, который дожен модифицировать записи InvAbon (null) на те, которые получатся в результате запроса:
UPDATE Result SET InvAbon = (
SELECT Sum(efir.SDR)
FROM Result LEFT JOIN efir ON Result.CComp=efir.OperatorCode
GROUP BY Result.CComp, Result.NameComp);

или как сказала J++

UPDATE Result r SET r.InvAbon =
(SELECT Sum(e.SDR) FROM Result r1
LEFT JOIN efir e ON r1.CComp=e.OperatorCode
WHERE r1.CComp=r.CComp and r1.NameComp=r.NameComp
);

Но почему-то модифицировать записи так и не получилось
  Ответить с цитированием
Старый 29.09.2005, 09:52   #6   
Бывалый форумец
 
Аватар для J++
 
Сообщений: 687
Регистрация: 05.08.2005

J++ вне форума Не в сети
А может я попробую

Пришли pls обе таблицы, участвующие в последнем запросе. Разумеется, если они не очень длинные (у меня гейт пропускает файлы размером не более ~3 Mb, и почтовый ящик примерно такого же размера).

Можно попробовать разбить на пару-тройку частей если что, но слать след. часть только после того, как я удалю предыдущую из почты и вышлю подтверждение

Например создай новую БД, экспортируй в нее только две нужные таблицы из старой БД и пришли мне файл mdb.
Если пришлешь, я попробую в своем Access.

Мой рабочий email jana(собака)crk(точка)vsi(точка)ru .
WBR,
Jana
  Ответить с цитированием
Старый 29.09.2005, 10:55   #7   
Форумец
 
Аватар для Billingist
 
Сообщений: 321
Регистрация: 26.09.2005
Возраст: 40

Billingist вне форума Не в сети
Кстати,
Скажу еще, что таблицы efir, ttf и company формата Paradox 7 и 4, я открыл их через Access. А таблица Result Access формата.

Может как раз в этом и есть загвоздка?
  Ответить с цитированием
Старый 30.09.2005, 15:45   #8   
Форумец
 
Аватар для Billingist
 
Сообщений: 321
Регистрация: 26.09.2005
Возраст: 40

Billingist вне форума Не в сети
Задача решена 3 - мя запросами!!!!
Без INSERT и UPDATE в связки с SELECT !!!
Вот решение

Нужно получить таблицу с полями: Result(OpertorCode, OperatorName, ComInv, InvAbon, InvComp).
OpertorCode, OperatorName- код и имя компании соответственно берутся из справочника COMPANY
CompInv, InvAbon - расчетные данные из таблицы efir
InvComp - расчетные данные из таблицы ttf

Запрос 1

SELECT DISTINCT Company.OperatorCode, Company.OperatorName, 'ROUMOUT' tit, SUM( Efirdtl.SDR ) CompInv, SUM( Efirdtl.CostCCC ) InvAbon
FROM "COMPANY.DB" Company
LEFT OUTER JOIN "efirdtl.DB" Efirdtl
ON (Company.OperatorCode = Efirdtl.OperatorCode)
WHERE (Company.DateEnd IS NULL)
AND Company.OperatorCode NOT IN ('CCC')
GROUP BY Company.OperatorCode, Company.OperatorName
UNION ALL
SELECT Company.OperatorCode, Company.OperatorName, 'ROUMIN ' tit, SUM( ttf.CostCCC ) CompInv, SUM( ttf.CostCCC ) InvAbon
FROM "COMPANY.DB" Company
LEFT OUTER JOIN "ttf.DB" ttf
ON (Company.OperatorCode = ttf.OperatorCode)
WHERE (Company.DateEnd IS NULL)
AND Company.OperatorCode NOT IN ('CCC')
GROUP BY Company.OperatorCode, Company.OperatorName

Сохраняем получившуюся таблицу - Result

Запрос 2

UPDATE 'RESULT.DB' R
SET R.InvAbon = NULL
WHERE TIT IN ('ROUMIN')

Запрос 3

SELECT R.OperatorCode, R.OperatorName, R.CompInv, R.InvAbon, R1.CompInv AS InvComp
FROM 'result.db' R, 'result.db' R1
WHERE R1.TIT IN ('ROUMIN') AND R.OperatorCode = R1.OperatorCode AND
R.TIT IN ('ROUMOUT')

ВСЕ!

А вот можно ли все таки в ACCESS в UPDATE в качестве выражения использовать запрос вопрос остается открытым покрайней мере для меня.
  Ответить с цитированием
Поиск в теме: 



Быстрый переход:

  Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Support by DrIQ & Netwind