![]() |
Нужна помощь по составлению запроса на обновление
Предисловие:
Есть две таблицы - т1 главная и т2 подчиненная. Связаны по номеру. т2 была создана в аксессе для всех существующих записей в таблице т1. Состоит из двух столбцов: 1) первый столбец - номер, по которому связаны т1 и т2, 2) второй - число, которое формируется, например, по дате из таблицы т1 по принципу "yyyymm". И теперь, когда в главную таблицу добавляем записи, в подчиненной столбцы с 5-ти значным номером ещё пустые. Пробовала обновлять так: UPDATE т2 SET число = Year([т1]![Date]) & Month([т1]![Date]) & [statemnt_ID]![ID] WHERE т1.номер = т2.номер В результате новые записи из таблицы т1 не были включены в результат... :confused: Вопрос: Как правильно составить запрос на обновление подчиненной таблицы т2? Цитата:
Правильно будет так: UPDATE т2 SET число = Year([т1]![Date]) & Month([т1]![Date]) WHERE т1.номер = т2.номер |
Цитата:
|
да...я вот об этом и пытаюсь спросить....как же все-таки обновить...
не вручную же эти номера, по которым потом будем связывать, во вторую таблицу добавлять :( |
Вполне стандартная практика - добавляется запись в одну таблицу, потом определяется <ключ> этой новой записи первой таблицы, и делается вставка во вторую таблицу (т.к. об её обновлении речи конечно быть не может ввиду отсутствия во второй таблице ключа для связи).
INSERT таблица2(поле_значения, поле_связи) VALUES(значение, ключ) |
но как создать то самое ключевой поле...
например возьмем исходные данные: Изначально существует главная таблица - пусть будет "главная" - поля: номер, Date. На основе "главной" создаем таблицу "новая" так: SELECT главная.номер, Year(главная!Date) & Month(главная!Date) As Code INTO новая FROM главная Получаем таблицу "новая", состоящую из двух столбцов: номер, Code. Она связана с "главной" по полю "номер". подумала, что может добавить счетчик для каждой, но тогда, на мой взгляд, две проблемы: во-первых может не совпасть первоначальная связка по номерам и эти номера при добавлении будут продублированы (а должны быть уникальными), а во-вторых если в "главной" будет 50 записей по счетчику (после добавлений), а в "новой" останется 30, то у нас опять не хватает 20 ключей, их просто нет.... что-то у меня совсем мозги не работают... если есть время - объясните, пожалуйста, поподробнее :молись: |
Похоже прежде чем решать конкретную проблему, надо разобраться с проектированием самой БД.
При таком создании "новой" таблицы получается связь один к одному, т.е. одной записи первой таблицы всегда соответствует одна запись другой. Встают вопросы: - А действительно ли необходимо тогда разносить данные по двум таблицам? Может просто добавить поле Code (ну или все необходимые поля) в первую и всё? Зачем нужны тут две таблицы? - Действительно ли между таблицами связь только один к одному, или возможны ситуации, когда несколько записей второй таблицы ссылаются на одну и ту же в первой? |
ВСЁЁ! :cool: разобралась
может кому-то поможет, вот как получилось: сначала добавляем ещё несуществующие номера в "новую" INSERT INTO новая ( номер ) SELECT номер FROM главная WHERE номер NOT IN (SELECT номер FROM новая) и потом это дело все обновляем: UPDATE главная LEFT JOIN новая ON главная.номер=новая.номер SET новая.Code = Year(главная!Date) & Month(главная!Date) ЕЖ, огромное Вам спасибо! Вы мои мысли в правильном направлении построили :yees: |
Всё это можно было и в одном INSERT сделать, без UPDATE.
И потом так и не понятно осталось по связям - 1-1 или 1-* ? |
ну да, конечно можно, просто по пунктам понятнее ;)
связь - 1 к 1, а данные разносить обязательно...потому что это работа связана с дипломным проектом и главная (будем так называть) таблица у нас как-будто есть...мы её получаем с помощью конвертирования отсканированного отчета... а все остальное, то что я добавляю для выполнения задания, естесственно я должна добавлять отдельными таблицами...иначе скажут, что "непрофессионально" :) |
По поводу "профессионально" - с точки зрения проектирования БД я бы поспорил со всеми приведенными доводами, но с точки зрения дипломного проектирования - вам виднее ;)
|
я бы тоже поспорила....но терзают меня смутные сомнения, что на защите это может закончится не так, как мне бы хотелось ;)
стараюсь следовать ценным указаниям :contract: |
| Часовой пояс GMT +4, время: 02:03. |
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.