COALESCE в Oracle Ocl не ведет себя, как ожидалось - PullRequest
0 голосов
/ 05 мая 2019

Недавно я получил ответ на вопрос о том, как обновить столбец B таблицы A на значения из столбца D таблицы C, соответствующие идентификаторам.

UPDATE Table2 t2
    SET D_N = COALESCE( (SELECT t1.D_N FROM Table1 t1 WHERE t1.D_ID 
= t2.D_ID), 0);

Код сработал, и теперь я пытаюсь сделать то же самое, только сравнение не выполняется для полей VARCHAR/VARCHAR2, а NUMBER. Поля, на которые я ссылаюсь, D_ID. Код работал на VARCHAR2/VARCHAR полях и теперь это NUMBER.

Я думал, что это будет легко исправить, поэтому я создал временный столбец для каждой таблицы и заполнил его значениями с помощью метода to_char, и моя схема, как и ожидалось, показывает столбец с типом данных VARCHAR2 для обоих Столбцы Таблица1 и Таблица2 D_ID.

Я все еще получаю сообщение об ошибке ORA-00932: inconsistent datatypes: expected CHAR got NUMBER.

DDL для рассматриваемых таблиц:

CREATE TABLE  "Table1" 
   (    
    "D_ID" NUMBER(4,0), 
    "D_N" VARCHAR2(30) COLLATE "USING_NLS_COMP" CONSTRAINT "D_N_NN" NOT NULL ENABLE, 
    "TEMPDEPTID" VARCHAR2(4) COLLATE "USING_NLS_COMP", 
     CONSTRAINT "D_ID_PK" PRIMARY KEY ("D_ID")
  USING INDEX  ENABLE
   )  DEFAULT COLLATION "USING_NLS_COMP"
/
ALTER TABLE  "Table1" ADD CONSTRAINT "D_L_FK" FOREIGN KEY ("L_ID")
      REFERENCES  "Table3" ("L_ID") ENABLE
/
ALTER TABLE  "Table1" ADD CONSTRAINT "D_M_FK" FOREIGN KEY ("M_ID")
      REFERENCES  "Table2" ("E_ID") ENABLE
/


CREATE TABLE  "Table2" 
   (    
    "D_ID" NUMBER(4,0), 
    "TEMPDEPTID" VARCHAR2(4) COLLATE "USING_NLS_COMP", 
    "D_N" VARCHAR2(30) COLLATE "USING_NLS_COMP", 
     CONSTRAINT "EMP_EMP_ID_PK" PRIMARY KEY ("E_ID")
  USING INDEX  ENABLE, 

   )  DEFAULT COLLATION "USING_NLS_COMP"
/
ALTER TABLE  "Table2" ADD CONSTRAINT "EMP_D_FK" FOREIGN KEY ("D_ID")
      REFERENCES  "Table1" ("D_ID") ENABLE
/
ALTER TABLE  "Table2" ADD CONSTRAINT "EMP_M_FK" FOREIGN KEY ("M_ID")
      REFERENCES  "Table2" ("E_ID") ENABLE
/

Спасибо.

1 Ответ

0 голосов
/ 05 мая 2019

0 в конце COALESCE вызывало это, кажется,

UPDATE Table2 t2
    SET D_N = COALESCE( (SELECT t1.D_N FROM Table1 t1 WHERE t1.D_ID 
= t2.D_ID), 0);

изменился на

UPDATE Table2 t2
    SET D_N = COALESCE( (SELECT t1.D_N FROM Table1 t1 WHERE t1.D_ID 
= t2.D_ID), '-');

сделал это для меня.

...