我正在尝试使用此引用语句 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。
这里的问题是您没有为占位符查询中的列指定任何名称。尝试:
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)