ORA-00918: столбец задан неоднозначно при вставке нескольких строк - PullRequest
1 голос
/ 06 января 2020

Я пытаюсь добавить несколько строк в таблицу, используя эту ссылку, оператор 8:

INSERT INTO people (person_id, given_name, family_name, title) 
  WITH names AS ( 
    SELECT 4, 'Ruth',     'Fox',      'Mrs'    FROM dual UNION ALL 
    SELECT 5, 'Isabelle', 'Squirrel', 'Miss'   FROM dual UNION ALL 
    SELECT 6, 'Justin',   'Frog',     'Master' FROM dual UNION ALL 
    SELECT 7, 'Lisa',     'Owl',      'Dr'     FROM dual 
  ) 
  SELECT * FROM names

Проблема в том, что она использует таблицу с именем names, которая не упоминалась до этого примера , Я обработал его как заполнитель и продолжил свой собственный запрос, который выглядит следующим образом:

INSERT INTO guest (first_name, last_name, address, phone, email, document_id, nationality, status, reservation_id, document_type_id) 
  WITH names AS ( 
    SELECT 'John', 'Doe', 'Grove Street 8', 111222333, 'johndoe@mail.com', 'JFV5R3', 'English', 1, 1, 1 FROM dual UNION ALL 
    SELECT 'Jane', 'Done', 'Sunrise Avenue 10', 111222335, 'janed@mail.com', 'GFV433', 'English', 1, 2, 1 FROM dual UNION ALL 
    SELECT 'Hannah', 'Drewton', 'Elm Street 8', 551222333, 'hannah@mail.com', 'GETER3', 'English', 1, 3, 1 FROM dual UNION ALL 
    SELECT 'David', 'Drewton', 'Elm Street 8', 551225333, 'dvddrw@mail.com', '94TER3', 'English', 1, 4, 1 FROM dual 
  )
  SELECT * FROM names;

Как и ожидалось, я получаю следующую ошибку: SQL Error: ORA-00918: column ambiguously defined. В чем может быть проблема? Я думаю, это как-то связано с этой колонкой names, но я не могу понять, что именно. Вот мой DDL для таблицы, в которую я пытаюсь вставить данные:

CREATE TABLE guest (
    id                 INTEGER
        GENERATED BY DEFAULT AS IDENTITY ( START WITH 1 CYCLE CACHE 1000 ORDER )
    NOT NULL,
    first_name         VARCHAR2(50) NOT NULL,
    last_name          VARCHAR2(50) NOT NULL,
    address            VARCHAR2(200) NOT NULL,
    phone              NUMBER,
    email              VARCHAR2(100),
    document_id        VARCHAR2(30) NOT NULL,
    nationality        VARCHAR2(50) NOT NULL,
    status             INTEGER DEFAULT 1 NOT NULL,
    reservation_id     INTEGER NOT NULL,
    document_type_id   INTEGER NOT NULL
)
LOGGING;

ALTER TABLE guest
    ADD CONSTRAINT ck_guest_status CHECK ( status BETWEEN 1 AND 5 );

COMMENT ON TABLE guest IS
    'Stores information about guests.';

ALTER TABLE guest ADD CONSTRAINT guest_pk PRIMARY KEY ( id );

ALTER TABLE guest
    ADD CONSTRAINT gst_dcmnt_tp_fk FOREIGN KEY ( document_type_id )
        REFERENCES document_type ( id )
    NOT DEFERRABLE;

В общем, я хочу, чтобы моя таблица автоматически увеличивала присвоение идентификатора гостевому идентификатору при вставке строки.

1 Ответ

4 голосов
/ 06 января 2020

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

INSERT INTO guest (first_name, last_name, address, phone, email,
                   document_id, nationality, status, reservation_id, document_type_id) 
  WITH names (first_name, last_name, address, phone, email, 
              document_id, nationality, status, reservation_id, document_type_id) AS ( 
    SELECT 'John', 'Doe', 'Grove Street 8', 111222333, 'johndoe@mail.com', 'JFV5R3', 'English', 1, 1, 1 FROM dual UNION ALL 
    SELECT 'Jane', 'Done', 'Sunrise Avenue 10', 111222335, 'janed@mail.com', 'GFV433', 'English', 1, 2, 1 FROM dual UNION ALL 
    SELECT 'Hannah', 'Drewton', 'Elm Street 8', 551222333, 'hannah@mail.com', 'GETER3', 'English', 1, 3, 1 FROM dual UNION ALL 
    SELECT 'David', 'Drewton', 'Elm Street 8', 551225333, 'dvddrw@mail.com', '94TER3', 'English', 1, 4, 1 FROM dual 
  )
  SELECT * FROM names;

Если вы не указали никаких имен, Oracle присваивает имена столбцам после значений в первой строке: 'JOHN', 'DOE' et c. Это вызывает у вас неоднозначность, потому что у вас есть 3 столбца, содержащие значение 1 в первой строке, в результате чего 3 столбца с именем 1!

Этот запрос показывает, как Oracle именует столбцы:

  WITH names  AS ( 
    SELECT 'John', 'Doe', 'Grove Street 8', 111222333, 'johndoe@mail.com', 'JFV5R3', 'English', 1 FROM dual UNION ALL 
    SELECT 'Jane', 'Done', 'Sunrise Avenue 10', 111222335, 'janed@mail.com', 'GFV433', 'English', 1 FROM dual UNION ALL 
    SELECT 'Hannah', 'Drewton', 'Elm Street 8', 551222333, 'hannah@mail.com', 'GETER3', 'English', 1 FROM dual UNION ALL 
    SELECT 'David', 'Drewton', 'Elm Street 8', 551225333, 'dvddrw@mail.com', '94TER3', 'English', 1 FROM dual 
  )
  SELECT * FROM names where "'DOE'" = 'Drewton';

Результаты:

'JOHN' 'DOE'   'GROVESTREET8'     111222333 'JOHNDOE@MAIL.CO 'JFV5R 'ENGLIS          1
------ ------- ----------------- ---------- ---------------- ------ ------- ----------
Hannah Drewton Elm Street 8       551222333 hannah@mail.com  GETER3 English          1
David  Drewton Elm Street 8       551225333 dvddrw@mail.com  94TER3 English          1
...