Если это ваш первый визит, рекомендуем почитать справку по форуму. Для размещения своих сообщений необходимо зарегистрироваться. Для просмотра сообщений выберите раздел. |
Использование Update |
Философия, технологии, алгоритмы! |
|
Опции темы |
27.09.2005, 15:53 | #1 |
Форумец
Сообщений: 321
Регистрация: 26.09.2005
Возраст: 40
Не в сети |
Использование 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, 09:00 | #3 |
Форумец
Сообщений: 321
Регистрация: 26.09.2005
Возраст: 40
Не в сети |
Access при таком запросе выдает сообщение "В операции должен использоваться обновляемый запрос" И естественно не модифицирует записи
|
28.09.2005, 10:11 | #4 |
Бывалый форумец
Сообщений: 687
Регистрация: 05.08.2005
Не в сети |
Не знаю точно насчет 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 |
Форумец
Сообщений: 321
Регистрация: 26.09.2005
Возраст: 40
Не в сети |
Естественно 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 |
Бывалый форумец
Сообщений: 687
Регистрация: 05.08.2005
Не в сети |
А может я попробую
Пришли pls обе таблицы, участвующие в последнем запросе. Разумеется, если они не очень длинные (у меня гейт пропускает файлы размером не более ~3 Mb, и почтовый ящик примерно такого же размера).
Можно попробовать разбить на пару-тройку частей если что, но слать след. часть только после того, как я удалю предыдущую из почты и вышлю подтверждение Например создай новую БД, экспортируй в нее только две нужные таблицы из старой БД и пришли мне файл mdb. Если пришлешь, я попробую в своем Access. Мой рабочий email jana(собака)crk(точка)vsi(точка)ru . WBR, Jana |
29.09.2005, 10:55 | #7 |
Форумец
Сообщений: 321
Регистрация: 26.09.2005
Возраст: 40
Не в сети |
Кстати,
Скажу еще, что таблицы efir, ttf и company формата Paradox 7 и 4, я открыл их через Access. А таблица Result Access формата. Может как раз в этом и есть загвоздка? |
30.09.2005, 15:45 | #8 |
Форумец
Сообщений: 321
Регистрация: 26.09.2005
Возраст: 40
Не в сети |
Задача решена 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 в качестве выражения использовать запрос вопрос остается открытым покрайней мере для меня. |