Oracle APEX - Таблица поиска с несколькими ссылками - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть вопрос, связанный с созданием таблицы поиска.

Предположим этот сценарий: у меня есть несколько таблиц, связанных с населением мира, с различной информацией, таких как ВСЕГО, ЖЕНЩИНА, МУЖЧИНА, OVER_65, UNDER_15. Это все разные таблицы. Каждая таблица имеет название страны в виде столбца. Я могу создать справочную таблицу из названия страны на основе 1 таблицы, например, ВСЕГО.

Как я могу также реализовать то же действие для других таблиц, чтобы отобразить новую таблицу поиска? Я не могу воссоздать, потому что объект уже там. Данные одинаковы. Я хочу обновить столбец названия страны с идентификатором страны в других таблицах на основе созданной справочной таблицы.

Я также ищу ответ. Если я найду в это время, я опубликую это.

[РЕДАКТИРОВАТЬ] Я также создал скриншоты APEX, которые объясняют мой вопрос.

Simulation steps

1 Ответ

0 голосов
/ 17 апреля 2020

Когда вы создаете таблицу поиска в мастерской SQL, APEX генерирует несколько операторов DDL и DML для выполнения этой работы. На последнем шаге мастера вы сможете развернуть область SQL внизу, чтобы увидеть код. К сожалению, он не очень хорошо отформатирован, но его не так сложно очистить.

В качестве теста я вошел и создал таблицу поиска в столбце JOB таблицы EMP. Вот код, который был сгенерирован. Я отформатировал его и добавил комментарии, чтобы объяснить, какие части вам понадобятся, а какие нет.

/*
* Creates the lookup table. Not needed after the first pass.
*/
create table "JOB_LOOKUP"(
  "JOB_ID" number not null primary key, 
  "JOB" varchar2(4000) not null
);

/*
* Creates the sequence for the primary key of the lookup table. 
* Not needed after the first pass.
*/
create sequence "JOB_LOOKUP_SEQ";

/*
* Creates the trigger that links the sequence to the table.
* Not needed after the first pass. 
*/
create or replace trigger "T_JOB_LOOKUP" 
before insert or update on "JOB_LOOKUP" 
for each row 
begin 
if inserting and :new."JOB_ID" is null then 
  for c1 in (select "JOB_LOOKUP_SEQ".nextval nv from dual) loop 
    :new."JOB_ID" := c1.nv;   end loop; end if; 
end;
/

/*
* Inserts the distinct values from the source table into the lookup
* table. If the lookup table already contains ALL of the needed values,
* country names in your case, then you can skip this step. However, if
* the source table has some values that are not in the lookup table, then
* you'll need to execute a modified version of this step. See notes below.
*/
insert into "JOB_LOOKUP" ( "JOB" ) 
select distinct "JOB" from "DMCGHANTEST"."EMP"
where "JOB" is not null;

/*
* The rest of the statements add the foreign key column, populate it,
* remove the old column, rename the new column, and add the foreign key.
* All of this is still needed.
*/
alter table "EMP" add "JOB2" number;

update "EMP" x set "JOB2" = (select "JOB_ID" from "JOB_LOOKUP" where "JOB" = x."JOB");

alter table "EMP" drop column "JOB";
alter table "EMP" rename column "JOB2"  to "JOB_ID";
alter table "EMP" add foreign key ("JOB_ID") references "JOB_LOOKUP" ("JOB_ID");

Что касается оператора вставки, который заполняет таблицу поиска, вот измененная версия, need:

insert into "JOB_LOOKUP" ( "JOB" ) 
select distinct "JOB" from "DMCGHANTEST"."EMP"
where "JOB" is not null
  and "JOB" not in (
    select "JOB"
    from JOB_LOOKUP
  );

Это обеспечит добавление в таблицу поиска только новых уникальных значений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...