Oracle
 sql >> база данни >  >> RDS >> Oracle

Oracle APEX - справочна таблица с няколко връзки

Когато създавате справочна таблица в SQL Workshop, 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");

Що се отнася до израза за вмъкване, който попълва справочната таблица, ето модифицираната версия, от която се нуждаете:

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
  );

Това ще гарантира, че само нови, уникални стойности се добавят към справочната таблица.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да се посочи идентификаторът на родител в идентификатора на дете с JPA/Hibernate?

  2. Как да върна RefCursor от функцията на Oracle?

  3. Сравнение на доставчици, съвместими с Entity Framework за Oracle?

  4. Oracle sqlldr обработва ли няколко INFILE паралелно

  5. Oracle 12c Топ нови функции