Модераторы: Akina

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Синтаксис вложений в UPDATE, Синтаксис 
:(
    Опции темы
c00per
Дата 2.2.2011, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 12.1.2009

Репутация: нет
Всего: нет



Пишу прогу на Delphi, использую БД access'а. Не могу выполнить запрос на обновление. есть одна главная таблица и 6 дочерних. Связь везде один ко многим. Другими словами главная таблица и 6 справочников. 

В запросе на обновление присутствие SELECT не возможно. Использую INNER JOIN. Никак не могу разобраться в синтаксисе.  smile 
Подскажите как правильно связать эти таблицы?

вот пример как пишу запрос из двух таблиц
Код

UPDATE <таблица1> INNER JOIN <таблица2> ON (<таблица1>.<поле1>=<таблица2>.<поле1> AND <таблица2>.<поле2>=<условие1>)
SET <список обновляемых полей>
WHERE <условия>

PM MAIL   Вверх
Akina
Дата 2.2.2011, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 30
Всего: 454



Цитата(c00per @  2.2.2011,  21:52 Найти цитируемый пост)
Никак не могу разобраться в синтаксисе

Запустите Аксесс.
Создайте или откройте базу данных.
Перейдите на вкладку Запросы.
Выберите создание запроса в режиме конструктора.
Переведите вид в режим SQL.
Наберите слово UPDATE.
Нажмите F1.
Читайте.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
c00per
Дата 3.2.2011, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 12.1.2009

Репутация: нет
Всего: нет



За совет спасибо конечно, но я уже облазил справку вдоль и поперек. Делаю вот такой запрос
Код

UPDATE matplata 
INNER JOIN (video 
INNER JOIN (ram 
INNER JOIN (privod 
INNER JOIN (hdd 
INNER JOIN (cpu 
INNER JOIN sistembloki ON cpu.id_cpu = sistembloki.id_cpu) 
     ON hdd.id_hdd = sistembloki.id_hdd) 
     ON privod.id_privod = sistembloki.id_privod) 
     ON ram.id_ram = sistembloki.id_ram) 
     ON video.id_video = sistembloki.id_video) 
     ON matplata.id_matplata = sistembloki.id_matplaty 
SET sistembloki.price = 777, sistembloki.id_matplaty = "Intel  82945 G Express", 
     sistembloki.id_cpu = "Pentium (R)  4 CPU (1.80 GHz)", sistembloki.id_hdd = "40 Gb", 
     sistembloki.id_privod = "CD-ROM/ DVD-ROM", sistembloki.id_ram = "256 Mb",
     sistembloki.id_video = "SiS 650_651_M650_M652_740 (32 Mb)"
WHERE (((sistembloki.inv_nomer)=222));


в таблице sistembloki существует запись с индексом 222, но почему то он ее не обновляет. Пишет "Будет обновлено 0 записей"

Это сообщение отредактировал(а) c00per - 3.2.2011, 10:30
PM MAIL   Вверх
Akina
Дата 3.2.2011, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 30
Всего: 454



Цитата(c00per @  3.2.2011,  11:29 Найти цитируемый пост)
 Делаю вот такой запрос

Отлично... в MS Access запрос на обновление можно открывать в режиме запроса на выборку - и соответственно смотреть. какие записибудут обновлены.
Вот и проделайте это. Если показывается "запись с индексом 222", но не обновляется - это и правда косяк. А если не показывается - значит, она отсекается условиями связывания.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
c00per
Дата 3.2.2011, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 12.1.2009

Репутация: нет
Всего: нет



Может стоить изменить в запросе?
Код

UPDATE matplata 
...


на это 
Код

UPDATE sistembloki

PM MAIL   Вверх
Akina
Дата 4.2.2011, 09:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 30
Всего: 454



c00per, переделайте запрос полностью. Замените все джойны на декартово произведение и условия отбора.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
c00per
Дата 4.2.2011, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 12.1.2009

Репутация: нет
Всего: нет



Это что то типа этого:
Код

UPDATE sistembloki INNER JOIN (matplata
                   INNER JOIN (video 
                   INNER JOIN (ram 
                   INNER JOIN (privod 
                   INNER JOIN (hdd 
                   INNER JOIN (cpu ON (cpu.id_cpu = sistembloki.id_cpu AND cpu.cpu="Pentium (R) 4 CPU (1.80 GHz)")) 
                                   ON (hdd.id_hdd = sistembloki.id_hdd AND hdd.hdd="40 Gb")) 
                                   ON (privod.id_privod = sistembloki.id_privod AND privod.privod = "CD-ROM/ DVD-ROM")) 
                                   ON (ram.id_ram = sistembloki.id_ram AND ram.ram = "256 Mb")) 
                                   ON (video.id_video = sistembloki.id_video AND video.video = "SiS 650_651_M650_M652_740 (32 Mb)")) 
                                   ON (matplata.id_matplata = sistembloki.id_matplaty AND matplata.matplata = "Intel  82945 G Express") 
SET sistembloki.price = 777, sistembloki.id_matplaty = matplata.id_matplata, sistembloki.id_cpu = cpu.id_cpu, 
       sistembloki.id_hdd = hdd.id_hdd, sistembloki.id_privod = privod.id_privod, sistembloki.id_ram = ram.id_ram, 
       sistembloki.id_video = video.id_video
WHERE sistembloki.inv_nomer=222;


Цитата

Замените все джойны на декартово произведение и условия отбора

Я не очень то силен в sql. Разъясни, пожалуйста

Это сообщение отредактировал(а) c00per - 4.2.2011, 11:46
PM MAIL   Вверх
Akina
Дата 4.2.2011, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 30
Всего: 454



Код

UPDATE 
 sistembloki
,matplata
,video 
,ram 
,privod 
,hdd 
,cpu
SET
 sistembloki.price = 777
,sistembloki.id_matplaty = matplata.id_matplata
,sistembloki.id_cpu = cpu.id_cpu
,sistembloki.id_hdd = hdd.id_hdd
,sistembloki.id_privod = privod.id_privod
,sistembloki.id_ram = ram.id_ram
,sistembloki.id_video = video.id_video
WHERE
cpu.id_cpu = sistembloki.id_cpu AND 
cpu.cpu="Pentium (R) 4 CPU (1.80 GHz)" AND
hdd.id_hdd = sistembloki.id_hdd AND 
hdd.hdd="40 Gb" AND
privod.id_privod = sistembloki.id_privod 
AND privod.privod = "CD-ROM/ DVD-ROM" AND
ram.id_ram = sistembloki.id_ram AND 
ram.ram = "256 Mb" AND
video.id_video = sistembloki.id_video AND 
video.video = "SiS 650_651_M650_M652_740 (32 Mb)" AND
matplata.id_matplata = sistembloki.id_matplaty AND 
matplata.matplata = "Intel  82945 G Express" AND
sistembloki.inv_nomer=222;


C другой стороны запрос - бредовый...
Смотри. У тебя условие отбора (ну или в исходном запросе - свяывания)
WHERE cpu.id_cpu = sistembloki.id_cpu 
Т.е. УЖЕ равно.
В то же время ты обновляешь 
SET sistembloki.id_cpu = cpu.id_cpu
Т.е. пишешь что-то типа
If 10=X Then X=10...

Поневоле хочется спросить - нахрена???

Это сообщение отредактировал(а) Akina - 4.2.2011, 12:15


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
c00per
Дата 4.2.2011, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 12.1.2009

Репутация: нет
Всего: нет



в первом посте пример из двух таблиц работает без проблем. я по нему же делаю с несколькими таблицами.
Ваш этот тоже отвечает "Будет обновлено 0 записей"
я уже совсем запутался  smile 
PM MAIL   Вверх
Akina
Дата 4.2.2011, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 30
Всего: 454



Цитата(c00per @  4.2.2011,  15:02 Найти цитируемый пост)
Ваш этот тоже отвечает "Будет обновлено 0 записей"

Несомненно... я тебе сказал выше - у тебя ХРЕНЬ. И отсутствие логики.
Ты намерен изменить поля записей, в которых УЖЕ лежит то значение, кторое ты намерен туда поместить - неудивительно, что ноль записей, ибо ты ЕЩЁ ПОКА значения туда НЕ ПОМЕСТИЛ...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
c00per
Дата 4.2.2011, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 12.1.2009

Репутация: нет
Всего: нет



Видимо до вас не дошли фразы
Цитата

Никак не могу разобраться в синтаксисе. 
Подскажите как правильно связать эти таблицы?

и
Цитата

Я не очень то силен в sql. Разъясни, пожалуйста


Вы мне мой же пример выдаете и осуждаете! smile 
PM MAIL   Вверх
Akina
Дата 4.2.2011, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 30
Всего: 454



Цитата(c00per @  4.2.2011,  16:23 Найти цитируемый пост)
Вы мне мой же пример выдаете и осуждаете! 

Ваш пример приведён в каноническую форму - просто в качестве образца.
Что же до осуждения - я, кажется, внятно говорю, что ВЫ пока что просто НЕ ПОНИМАЕТЕ того, что хотите сделать.
Я тем более не понимаю. Более того - я не смогу понять - потому что не знаю ни предметной области, в которой происходит действо, ни постановки задачи, ни имеющихся уже структур и наполнений... по бутылке бензина я не смогу сказать, почему машина, которую я в глаза не видел и про которую ничего не слышал, не едет, и тут то же самое.



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
c00per
Дата 4.2.2011, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 12.1.2009

Репутация: нет
Всего: нет



Цитата

Пишу прогу на Delphi, использую БД access'а. Не могу выполнить запрос на обновление. есть одна главная таблица и 6 дочерних. Связь везде один ко многим. Другими словами главная таблица и 6 справочников.
Использую INNER JOIN. Никак не могу разобраться в синтаксисе. 
Подскажите как правильно связать эти таблицы?


ну уж если это не машина что не едет, тогда вот...
в приложенном файле расположены таблицы, поля и связи; и форма на которой происходит редактирование. Данные в комбобоксах берутся из справочников. эдиты заполняются из главной таблицы. 

Вот я и не могу создать запрос на обновление исходя из этих данных и таблиц

Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  info.JPG 64,86 Kb
PM MAIL   Вверх
Akina
Дата 4.2.2011, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 30
Всего: 454



Цитата(c00per @  4.2.2011,  22:46 Найти цитируемый пост)
в приложенном файле

Вот это почитайте...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
c00per
Дата 5.2.2011, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 12.1.2009

Репутация: нет
Всего: нет



прикройте тему, судя по всему здесь только модераторы отвечают на вопросы, а хотелось бы и услышать тех пользователей кто сталкивался с такой же проблемой как и у меня... за рекоммендации спасибо
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "MS Access"
Akina
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] и [code=sql][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MS Access | Следующая тема »


 




[ Время генерации скрипта: 0.1017 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.