powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Модифицирующий запрос с условием, где ссылки из трех таблиц
7 сообщений из 7, страница 1 из 1
Модифицирующий запрос с условием, где ссылки из трех таблиц
    #39115687
SAN_01_08
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблицы:
Код: plaintext
1.
2.
M    (ID Int, ID_OPER Int, ID_T4 Int, ...)     
OPER (ID Int, ID_PASP_M Int, ID_PASP_F Int, ...) 
PASP (ID Int, ID_T4 Int, ...) 

В M есть ссылка на таблицу OPER , которая, в свою очередь имеет ссылки на таблицу PASP
Таблица PASP содержит атрибут в виде ссылки на таблицу Т4 (что содержит таблица Т4 не имеет значения -
здесь работаем только со ссылками и идентификаторами).

Задача в том чтобы сочинить запрос (update) для заполнения нового поля ID_T4 в таблице M .
А условие можно сформулировать примерно так:
По значению ID_OPER в M найти записи в OPER , но такие, чтобы две записи из PASP ,
на которые ссылаются поля ID_PASP_M и ID_PASP_F в OPER , имели одинаковые значения в полях ID_4.

Значением для заполнения поля ID_T4 в таблице M в случае совпадения должно быть ID_T4 из PASP .

Если использовать приведенный пример таблиц и их записей, то результат работы модифицирующего запроса М должно содержать такие строки:
Код: plaintext
1.
2.
3.
4.
ID ID_OPER ID_T4
1  1       1
2  2       <null>
3  3       <null>
4  4       3

Может кому не левниво поразбираться в этом месиве.

Скрипт (сделан в IBExpert)

CREATE TABLE M (ID INTEGER NOT NULL, ID_OPER INTEGER, ID_T4 INTEGER);
CREATE TABLE OPER (ID INTEGER NOT NULL, ID_PASP_M INTEGER, ID_PASP_F INTEGER);
CREATE TABLE PASP (ID INTEGER NOT NULL, ID_T4 INTEGER);

execute block as begin
insert into pasp (ID, ID_T4) values (1, 1);
insert into pasp (ID, ID_T4) values (2, 1);
insert into pasp (ID, ID_T4) values (3, 2);
insert into pasp (ID, ID_T4) values (4, 3);
insert into pasp (ID, ID_T4) values (5, 3);

insert into oper (ID, ID_PASP_M, ID_PASP_F) values (1, 1, 2);
insert into oper (ID, ID_PASP_M, ID_PASP_F) values (2, 3, 2);
insert into oper (ID, ID_PASP_M, ID_PASP_F) values (3, 1, 4);
insert into oper (ID, ID_PASP_M, ID_PASP_F) values (4, 4, 5);

insert into M (ID, ID_OPER) values (1, 1);
insert into M (ID, ID_OPER) values (2, 2);
insert into M (ID, ID_OPER) values (3, 3);
insert into M (ID, ID_OPER) values (4, 4);
end
...
Рейтинг: 0 / 0
Модифицирующий запрос с условием, где ссылки из трех таблиц
    #39115693
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И в чём проблема? Один тривиальный update с подзапросом или merge без проблем справятся.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Модифицирующий запрос с условием, где ссылки из трех таблиц
    #39115702
SAN_01_08
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может быть. Но придумать этот тривиальный подзапрос не получается.
Про merge посмотрю. Спасибо.
...
Рейтинг: 0 / 0
Модифицирующий запрос с условием, где ссылки из трех таблиц
    #39115703
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SAN_01_08Но придумать этот тривиальный подзапрос не получается.
Потому что формулировка условия мутная. Вычисти.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Модифицирующий запрос с условием, где ссылки из трех таблиц
    #39115719
SAN_01_08
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Согласен, мутная, но чистил долго и нудно. Ан, все одно - мутната.
Про merge интересная наколка.
...
Рейтинг: 0 / 0
Модифицирующий запрос с условием, где ссылки из трех таблиц
    #39115944
DBConstructor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SAN_01_08По значению ID_OPER в M найти записи в OPER , но такие, чтобы две записи из PASP ,
на которые ссылаются поля ID_PASP_M и ID_PASP_F в OPER , имели одинаковые значения в полях ID_4.

Задача тривиальная! В чем проблема?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
SET TERM ^;
EXECUTE BLOCK
AS
  DECLARE VARIABLE M_ID INTEGER DEFAULT NULL;
  DECLARE VARIABLE T4 INTEGER DEFAULT NULL;
BEGIN
  FOR
      SELECT M.ID, P_F.ID_T4
        FROM M
          INNER JOIN OPER O ON O.ID = M.ID_OPER
          INNER JOIN PASP P_M ON P_M.ID = O.ID_PASP_M
          INNER JOIN PASP P_F ON P_F.ID = O.ID_PASP_F AND P_F.ID_T4 = P_M.ID_T4
        WHERE M.ID_T4 IS NULL
        INTO: M_ID, T4
    DO
      UPDATE M
        SET ID_T4 = :T4
        WHERE ID = :M_ID;
END^
SET TERM ;^
COMMIT WORK;
...
Рейтинг: 0 / 0
Модифицирующий запрос с условием, где ссылки из трех таблиц
    #39116092
SAN_01_08
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DBConstructor, спасибо, нет проблемы.
К этому варианту один-в-один вчера и пришел. Бывает забываешь простые вещи, видимо, в этом проблема.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Модифицирующий запрос с условием, где ссылки из трех таблиц
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]