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

Вниз

ADO+MSAccess+Update   Найти похожие ветки 

 
msguns ©   (2004-10-06 13:44) [0]

Не катит такой запрос:

UPDATE TblRes R
 SET Key4=
   (SELECT T1.Key4 FROM Tbl1 T1
     WHERE (T1.Key1=R.Key1) AND
           (T1.Key2=R.Key2) AND
           (T1.Key3=R.Key3))  


Говорит, что требуется запрос на обновление. Запускал и из Access, и из TADOCommand.


 
Nikolay M. ©   (2004-10-06 14:03) [1]

Попробуй. Под SQL Server работает.

UPDATE
 TblRes
SET
 Key4 = T1.Key4
FROM
 TblRes R,
 Tbl1 T1
WHERE
 (T1.Key1=R.Key1) AND
 (T1.Key2=R.Key2) AND
 (T1.Key3=R.Key3)


 
msguns ©   (2004-10-06 15:16) [2]

>Nikolay M. ©   (06.10.04 14:03) [1]

Кричит, что FROM без SELECT не канает ;(
(запускаю из-под аксеса)


 
sniknik ©   (2004-10-06 16:25) [3]

вот так должон
UPDATE TblRes R
SET Key4=
  (SELECT Max(T1.Key4) FROM Tbl1 T1
    WHERE (T1.Key1=R.Key1) AND
          (T1.Key2=R.Key2) AND
          (T1.Key3=R.Key3))


 
Nikolay M. ©   (2004-10-06 16:45) [4]


> sniknik ©   (06.10.04 16:25) [3]

У меня и твой тоже не работает. А почему должен сработать?


 
sniknik ©   (2004-10-06 17:00) [5]

> А почему должен сработать?
не знаю. но в током виде как был приведен идет присвоение еденичному полю массива значений (рекордсета), агрегатная функция гарантирует  что запрос тоже выдаст еденичное значение.

> У меня и твой тоже не работает.
счас проверю. а что говорит?
скорее и подзапрос неверен, ну хотя бы потому что в нем ссылка на внешнюю (по отношению к нему) таблицу R, в этом случае просто внутри нужно обьеденение сделать.


 
sniknik ©   (2004-10-06 17:03) [6]

а вообще то не буду (проверять), т.к. по смыслу запрос бредовый, не может быть чтобы именно этого хотели.


 
sniknik ©   (2004-10-06 17:20) [7]

вот так еще смысл есть
UPDATE TblRes R
INNER JOIN Tbl1 T1 ON
   R.Key1 = T1.Key1 AND
   R.Key2 = T1.Key2 AND
   R.Key3 = T1.Key3
SET R.Key4 = T1.Key4
(обновить все Key4 в таблице, а в оригинале неизвестно какой и значением из списка)


 
Nikolay M. ©   (2004-10-06 17:21) [8]

Может, он данные просто переносит?

Говорит, что хочет Updateable query.


 
msguns ©   (2004-10-06 17:34) [9]

Запрос вообще-то не бредовый. По крайней мере в IB все тип-топ.
А смысл простой:
Есть 2 схожие по стуктуре таблицы с полями
ID AutoInc
Key1 - поле логического ключа 1
 ...
KeyN - поле логического ключа N
Data1 - поле данных 1
 ...
DataN - поле данных N

Есть 3-я таблица такой же структуры, которая должна "объединить" данные 2-х первых

Делаю раз - удаление из Т3 всех записей
Делаю два - вставляю в Т3 все записи Т1
Делаю три - вставляю в Т3 все записи Т2, логические ключи которой отсутствуют в Т1
Делаю чертыре - в записях Т3, логические ключи в которой совпадают с лог.ключами Т2, замену полей данных

Вообще-то реальный пример, конечно, существенно сложнее, но смысл я передал достаточно точно. Что-то вроде репликации, а точнее объединение 2-х баз с разных компов в одну итоговую.

Раньше с IB подобная задачка для меня не представляла проблем, но вот пришлось иметь дело с ADO+Access, который я не знаю. Выкачал с sql.ru документацию, проутюжил ее всю, но там с UPDATE совсем куцые примеры :((


 
sniknik ©   (2004-10-06 17:39) [10]

ну так всетаки всю таблицу а не одно поле в неизвестном месте (аксес понимает именно так, судя по ошибке в [0]), попробуй запрос в [7].


 
msguns ©   (2004-10-06 17:45) [11]

>sniknik ©   (06.10.04 17:20) [7]

Все отработало ! Все дело в том, что комбинации логических ключей в каждой из исходных таблиц являются уникальными в пределах этих таблиц. Можно, конечно, создать индекс по этим полям и сделать его уникальным, но дело в том, что в реальных БД (а перед запуском объединеняющего приложения БД просто копируются с компов узеров) таких индексов нет. Соответственно и я не могу их туда добавить.


 
msguns ©   (2004-10-06 17:54) [12]

Спасибо всем, а особенно sniknik © !
Буду использовать новый (для меня) прием на реальных таблицах.


 
Nikolay M. ©   (2004-10-06 17:55) [13]


> sniknik ©   (06.10.04 17:20) [7]

Хм, практически такой же вариант я в [1] предлагал, не знал такой формы для аксеса.


 
msguns ©   (2004-10-07 12:14) [14]

А вот это что:

Проходит ->
UPDATE TblRes AS R
  INNER JOIN Tbl1 AS T1
     ON (R.Key1=T1.Key1) AND (R.Key2=T1.Key2) AND (R.Key3=T1.Key3)
  SET R.Key4 = T1.Key4, R.Data1 = T1.Data1, R.Data2 = T1.Data2, R.Data3 = T1.Data3;


Не проходит (вопит, что неверная конструкция UPDATE)->
UPDATE FONDSR AS R
  INNER JOIN Fonds IN "e:\DMsArch\FondsCmp\AlexDB\Data.mdb" AS TA
    ON (R.Letter=TA.Letter) AND (R.FondNumber=TA.FondNumber) AND
          (R.FondType=TA.FondType) AND (R.Category=TA.Category)
  SET R.AFID = TA.FID, R.AArcID = TA.ArcID;


Она, что IN для джоинов не хавает ?


 
Nikolay M. ©   (2004-10-07 12:17) [15]

Думаю, аксесу не нравится внешняя база и я его понимаю.


 
msguns ©   (2004-10-07 12:23) [16]

>Nikolay M. ©   (07.10.04 12:17) [15]
>Думаю, аксесу не нравится внешняя база и я его понимаю.

А вот это проскакивает на-ура:

INSERT INTO FONDSR ( FLT, FLA, Letter, FondNumber, FondType, Category, TFID, TArcId, TCountry, TSDate, TEDate, TFSize, TQDI, TQMF, TQS, TAvl, TPassT, TPassL, TPassN, TJoinL, TJoinN, TUtil, TLossId, TLossDt, TLossDc )
SELECT 1, 0, Letter, FondNumber, FondType, Category, FID, ArcId, Country, StartDate, EndDate, FondSize, DontInvent, Microfished, Secret, Availability, PassTo, PassLetter, PassNumber, JoinLetter, JoinNumber, UtilDate, LossCauseId, LossDate, LossDoc
FROM Fonds IN "e:\DMsArch\FondsCmp\TatDB\Data.mdb";


Наверное, поэтому я асксес и не понимаю.
Чего и вылазию сюда :(


 
Nikolay M. ©   (2004-10-07 12:26) [17]

Я имел ввиду, что ему не нравится это в апдейте.

Вылазий лучше сюда
http://www.sql.ru/forum/actualtopics.aspx?bid=4
там спецы есть серьезные, а тут только sniknik © :)


 
sniknik ©   (2004-10-07 12:27) [18]

http://delphimaster.net/view/3-1096621509/
приведена конструкция синоним IN, попробуй поменять.


 
msguns ©   (2004-10-07 12:59) [19]

>Nikolay M. ©   (07.10.04 12:26) [17]

Был там. Даже зарегился. Но послать сабж в форум не дает - орет, что произошла ошибка сервера (N раз подряд да и сегодня та же картина)

>sniknik ©   (07.10.04 12:27) [18]
Списибо за помощь, но придется все же брать лопату ;((


 
Nikolay M. ©   (2004-10-07 13:15) [20]


>  Но послать сабж в форум не дает - орет, что произошла ошибка
> сервера

Сегодня пару ответов запостил в МС СКЛ-ном форуме - без проблем :(



Страницы: 1 вся ветка

Текущий архив: 2004.11.07;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.059 c
14-1098349706
Викусик
2004-10-21 13:08
2004.11.07
О выборе студентки поездку в колхоз...


1-1098696258
Arkady
2004-10-25 13:24
2004.11.07
Каталог запуска программы


14-1098426785
gn
2004-10-22 10:33
2004.11.07
Модификация автомата Калашникова:


3-1097063564
Aser
2004-10-06 15:52
2004.11.07
Как присвоить переменной значение полученного Query?


14-1098188035
AlexG
2004-10-19 16:13
2004.11.07
Меня опять напугали совместимостью AMD шек