ORA-00918: 插入多行时列定义不明确

use*_*446 3 oracle plsql

我正在尝试使用此引用语句 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
Run Code Online (Sandbox Code Playgroud)

问题是它使用了一个名为的表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;
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,我收到以下错误: 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;
Run Code Online (Sandbox Code Playgroud)

通常,我希望我的表在插入行时自动递增为来宾 ID 分配一个 ID。

Ton*_*ews 7

这里的问题是您没有为占位符查询中的列指定任何名称。尝试:

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;
Run Code Online (Sandbox Code Playgroud)

当你不指定任何名称,甲骨文名第一行中的值之后,列:'JOHN','DOE'等等。这会导致歧义你,因为你有一个包含值1的第一行中,产生命名为3列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';
Run Code Online (Sandbox Code Playgroud)

结果:

'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
Run Code Online (Sandbox Code Playgroud)