IMHO.WS

IMHO.WS (https://www.imho.ws/index.php)
-   Программирование (https://www.imho.ws/forumdisplay.php?f=40)
-   -   Нужна помощь по составлению запроса на обновление (https://www.imho.ws/showthread.php?t=104179)

ёшкина кошка 27.05.2006 23:15

Нужна помощь по составлению запроса на обновление
 
Предисловие:

Есть две таблицы - т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]) & [statemnt_ID]![ID] WHERE т1.номер = т2.номер
на [statemnt_ID]![ID] не обращайте внимания...я свой запрос упрощала и не заметила, чт осталось лишнее.
Правильно будет так:
UPDATE т2 SET число = Year([т1]![Date]) & Month([т1]![Date]) WHERE т1.номер = т2.номер

ЕЖ 27.05.2006 23:36

Цитата:

ёшкина кошка:
И теперь, когда в главную таблицу добавляем записи, в подчиненной столбцы с 5-ти значным номером ещё пустые.
Не в этом ли причина? В первую таблицу идет именно добавление? Если так, то в первой таблице у новой записи будет новый номер, которому во второй таблице для связи по условию т1.номер = т2.номер взяться неоткуда.

ёшкина кошка 27.05.2006 23:54

да...я вот об этом и пытаюсь спросить....как же все-таки обновить...
не вручную же эти номера, по которым потом будем связывать, во вторую таблицу добавлять :(

ЕЖ 28.05.2006 00:16

Вполне стандартная практика - добавляется запись в одну таблицу, потом определяется <ключ> этой новой записи первой таблицы, и делается вставка во вторую таблицу (т.к. об её обновлении речи конечно быть не может ввиду отсутствия во второй таблице ключа для связи).

INSERT таблица2(поле_значения, поле_связи) VALUES(значение, ключ)

ёшкина кошка 28.05.2006 00:47

но как создать то самое ключевой поле...

например возьмем исходные данные:
Изначально существует главная таблица - пусть будет "главная" - поля: номер, Date.
На основе "главной" создаем таблицу "новая" так:

SELECT главная.номер, Year(главная!Date) & Month(главная!Date) As Code INTO новая
FROM главная

Получаем таблицу "новая", состоящую из двух столбцов: номер, Code.
Она связана с "главной" по полю "номер".


подумала, что может добавить счетчик для каждой, но тогда, на мой взгляд, две проблемы:
во-первых может не совпасть первоначальная связка по номерам и эти номера при добавлении будут продублированы (а должны быть уникальными),
а во-вторых если в "главной" будет 50 записей по счетчику (после добавлений), а в "новой" останется 30, то у нас опять не хватает 20 ключей, их просто нет....

что-то у меня совсем мозги не работают...
если есть время - объясните, пожалуйста, поподробнее :молись:

ЕЖ 28.05.2006 01:06

Похоже прежде чем решать конкретную проблему, надо разобраться с проектированием самой БД.

При таком создании "новой" таблицы получается связь один к одному, т.е. одной записи первой таблицы всегда соответствует одна запись другой. Встают вопросы:
- А действительно ли необходимо тогда разносить данные по двум таблицам? Может просто добавить поле Code (ну или все необходимые поля) в первую и всё? Зачем нужны тут две таблицы?
- Действительно ли между таблицами связь только один к одному, или возможны ситуации, когда несколько записей второй таблицы ссылаются на одну и ту же в первой?

ёшкина кошка 28.05.2006 01:17

ВСЁЁ! :cool: разобралась

может кому-то поможет, вот как получилось:

сначала добавляем ещё несуществующие номера в "новую"
INSERT INTO новая ( номер ) SELECT номер FROM главная
WHERE номер NOT IN (SELECT номер FROM новая)

и потом это дело все обновляем:
UPDATE главная LEFT JOIN новая ON главная.номер=новая.номер
SET новая.Code = Year(главная!Date) & Month(главная!Date)


ЕЖ, огромное Вам спасибо! Вы мои мысли в правильном направлении построили :yees:

ЕЖ 28.05.2006 01:32

Всё это можно было и в одном INSERT сделать, без UPDATE.

И потом так и не понятно осталось по связям - 1-1 или 1-* ?

ёшкина кошка 28.05.2006 01:40

ну да, конечно можно, просто по пунктам понятнее ;)

связь - 1 к 1, а данные разносить обязательно...потому что это работа связана с дипломным проектом и главная (будем так называть) таблица у нас как-будто есть...мы её получаем с помощью конвертирования отсканированного отчета...
а все остальное, то что я добавляю для выполнения задания, естесственно я должна добавлять отдельными таблицами...иначе скажут, что "непрофессионально" :)

ЕЖ 28.05.2006 01:50

По поводу "профессионально" - с точки зрения проектирования БД я бы поспорил со всеми приведенными доводами, но с точки зрения дипломного проектирования - вам виднее ;)

ёшкина кошка 28.05.2006 01:55

я бы тоже поспорила....но терзают меня смутные сомнения, что на защите это может закончится не так, как мне бы хотелось ;)
стараюсь следовать ценным указаниям :contract:


Часовой пояс GMT +4, время: 02:03.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.