Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.11.07;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.53 MB
Время: 0.069 c
14-1098196435
Holy
2004-10-19 18:33
2004.11.07
Кто как слушает музыку?


14-1098112656
Никита
2004-10-18 19:17
2004.11.07
Опрос :-)


14-1097656240
Семен Сорокин
2004-10-13 12:30
2004.11.07
Пейнтбол


1-1098722646
Kniaz
2004-10-25 20:44
2004.11.07
Как программа узнаёт что файл занят другим приложением.


1-1098394798
Makhanev A.S.
2004-10-22 01:39
2004.11.07
Директивы условной компиляции...





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский