![]() |
|
Модераторы: skyboy |
![]()
|
|
| icepro |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 175 Регистрация: 20.11.2006 Репутация: нет Всего: нет |
Есть 2 таблицы, первая содержит название производителя и скидку для этого производителя, например:
пр1 2% пр2 5% пр3 10% 1% а вторая содержит товары цены и производителей тов1 пр1 100 тов2 пр1 500 тов3 пр2 1000 тов4 пр3 200 тов5 300 тов6 500 подразумевается что в первой таблице для производителей пр1, пр2, пр3 указны проценты на сколько нужно уменьшить цену товаров этих производителей во второй таблице, та строка где нет производителя подразумевает что эта скидка действует для товаров у которых не указан производитель. мои действия: я заношу значения в первую таблицу, и должен во второй таблице уменьшит цену на указанный процент, делаю это например раз в месяц. подскажите как лучше организовать запрос на выполнение этих действий. заранее спасибо! |
|||
|
||||
| Gluttton |
|
|||
![]() Начинающий ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1170 Регистрация: 28.8.2008 Где: Феодосия Репутация: 24 Всего: 54 |
Можно попробовать подменить обновление созданием новой таблицы и удалением текущей.
При этом к имени создаваемой таблицы можно было бы добавлять суффикс с различной смысловой нагрузкой (например о дате проведения операции). Это сообщение отредактировал(а) Gluttton - 26.4.2009, 00:40 -------------------- Слава Україні! |
|||
|
||||
| Gluttton |
|
||||||
![]() Начинающий ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1170 Регистрация: 28.8.2008 Где: Феодосия Репутация: 24 Всего: 54 |
Упс... что то не то нажал
Тогда для БД из двух таблиц: ![]() ![]() Со следующими тестовыми данными: ![]() ![]() Можно было бы применить такие запросы: 1. Создающий новую таблицу с информацией о продукции (со структурой, аналогичной таблице с текущими данными).
2. Заполняющий новую таблицу обновленными данными (для не NULL Производителей).
3. Заполняющий новую таблицу обновленными данными (для NULL Производителей).
И в результате мы бы получили новую таблицу со следующими данными: ![]() P.S. + В качестве бонуса получаем самодокументируемый backup - Если в БД есть связи (а я так догадываюсь они есть) необходимо добавить ещё два запроса на удаление связи со "старой" таблицей и установку с "новой". - Процесс не до конца автоматизированый, т.к. нужно руками лезть в запрос и менять название "старой" и "новой" таблиц. Это сообщение отредактировал(а) Gluttton - 26.4.2009, 10:33 -------------------- Слава Україні! |
||||||
|
|||||||
| icepro |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 175 Регистрация: 20.11.2006 Репутация: нет Всего: нет |
Супер дружище! Помог очень! Только ты прав, связь есть, и связь с мускулом(( Не подскажешь как поменять связь... или может просто создать еще одни запрос который бы из новой таблицы без связи гнал данные в таблицу со связью??
|
|||
|
||||
| Gluttton |
|
||||||||
![]() Начинающий ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1170 Регистрация: 28.8.2008 Где: Феодосия Репутация: 24 Всего: 54 |
Чесно говоря, сталкиваться не приходилось. Вот здесь:
Я имел в виду наличие в БД внешних ключей. (По логике, для приведенного мною примера Производитель из таблицы Продукция, мог бы быть внешним ключем поля Производитель таблицы Скидки). И тогда после проведения операции псевдо-обновления нужно было бы удалить внешний ключ в "старой" таблице (хотя это и не обязательно если не удалять саму таблицу) и создать внешний ключ в "новой" таблице.
Если речь идет о внешних ключах, то подскажу (только детальней опиши БД).
Наличие органичений (внешних ключей, если о них был вопрос) на запрос не влияют. Запрос остается таким каким и был. Внешние ключи обеспечивают ссылочную целосность (тут пару дней назад "красный" топик на эту тему был Если данные "перегоняются" MySQL выполнением запроса, то всё, что нужно делать это в том запросе менять (уточнять) имя таблицы с ценами на текущую (т.е. если делать как я говорил и использовать суффиксы). А можно вообще после создания новой таблицы удалить старую, а потом новую переименовать в имя старой, тогда вообще должно быть счастье P.S. Жди понедельника - народ подтянеться, может что лучшее подскажут (т.к. приведённый мною способ своеобразный Это сообщение отредактировал(а) Gluttton - 26.4.2009, 14:44 -------------------- Слава Україні! |
||||||||
|
|||||||||
| icepro |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 175 Регистрация: 20.11.2006 Репутация: нет Всего: нет |
а можно без новой таблицы обойтись? править значения прямо в старой?
и поясни пожалуйста механику запроса, ну тоесть как работает
|
|||
|
||||
| icepro |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 175 Регистрация: 20.11.2006 Репутация: нет Всего: нет |
хотя подожди, по поводу запроса я понял, получается так:
стандартная форма запроса на вставку ИНСЕРТ ИНТО таблица (поля) ВЕЛЬЮЗ (значения), но это из мускула а тут по ходу слово ВЕЛЬЮЗ не нада и типа вставляет то что вернул запрос выборки, так? а по поводу таблиц думаю может действительно делать не ИНСЕРТ в новую а АПДЕЙТ в старую? Это сообщение отредактировал(а) icepro - 26.4.2009, 17:04 |
|||
|
||||
| Gluttton |
|
||||||
![]() Начинающий ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1170 Регистрация: 28.8.2008 Где: Феодосия Репутация: 24 Всего: 54 |
В общем случае можно, но в данном конкретном случае у меня не получилось. Поэтому я всю эту свистопляску и предложил
Для начала читаем здесь: Про INSERT в Access Если вопросы остануться отвечу Кстати проблема обновления в существующей таблице (для меня) заключается в невозможности подстановки тела этого оператора SELECT
в инструкцию UPDATE Про UPDATE в Access. -------------------- Слава Україні! |
||||||
|
|||||||
| icepro |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 175 Регистрация: 20.11.2006 Репутация: нет Всего: нет |
ага, так если не получается с апдетом, то как же я тогда в тсарую таблицу вкину данные из новой, это же тоже апдейт будет... есть мысли?
|
|||
|
||||
| Gluttton |
|
|||
![]() Начинающий ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1170 Регистрация: 28.8.2008 Где: Феодосия Репутация: 24 Всего: 54 |
Если наименование товара - первичный ключ, то не выйдет, если ключ сурогатный (а оно наверное так и есть), то можно попробовать. Но тогда необходимо удалить старые данные (что бы таблицу вернуть в корректное состояние), а для того что бы отличать старые данные от новых необходимо ввсести дополнительное поле. Хотя при условии, что отрицательных скидок не бывает, можно удалять старые значения как такие, какие иеют большую цену. Для более конкретного разговора рекомендую выложить структуру БД. -------------------- Слава Україні! |
|||
|
||||
| icepro |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 175 Регистрация: 20.11.2006 Репутация: нет Всего: нет |
наименование не первичный, первичный ключ ИД, а структура таже что и у тебя...
слушай а в Акцесе есть циклы? |
|||
|
||||
| icepro |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 175 Регистрация: 20.11.2006 Репутация: нет Всего: нет |
слушай а можно хоть макросом как то, только что б не КопироватьОбъект, а то я так понял если использовать эту команду и копировать таблицы то одна заменит другую, а мне так нельзя потому как старая связано с мускулом..
|
|||
|
||||
| Gluttton |
|
||||||||||||||||||
![]() Начинающий ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1170 Регистрация: 28.8.2008 Где: Феодосия Репутация: 24 Всего: 54 |
Нет (декларативный язык - говоришь не "как делать", а "что сделать").
Можно: 1. Создаем новую временную таблицу.
2. Заполняем ее обновленными данными.
и
3. Удаляем старую таблицу.
4. Создаем таблицу с именем старой.
5. Копируем в нее временную.
6. Удаляем временную таблицу.
P.S. 1. Перед удалением старой таблицы (п. 3) и после создания новой (п. 4) необходимо удалять и создавать соответственно ограничения (внешние ключи), если таковые имеються. 2. Использовать в качестве первичного ключа ID производителя, а в запросе проводить идентификацию по их наименованию - потенциально опасная конструкция, т.к. может получиться (это не запрещено на уровне СУБД), что один и тот же производитель пожет быть внесен в БД несколько раз под разными ID! Это сообщение отредактировал(а) Gluttton - 26.4.2009, 20:10 -------------------- Слава Україні! |
||||||||||||||||||
|
|||||||||||||||||||
| icepro |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 175 Регистрация: 20.11.2006 Репутация: нет Всего: нет |
тут вылазит проблемка, таблица со связью, если ее удалить то связь к серваку тоже будет потеряна... ща пробую делать через VBA
|
|||
|
||||
| icepro |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 175 Регистрация: 20.11.2006 Репутация: нет Всего: нет |
вот оно!!! решение!!!
|
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Составление SQL-запросов | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |