簡體   English   中英

PostgreSQL 插入表中,子查詢從多個其他表中選擇

[英]PostgreSQL Insert into table with subquery selecting from multiple other tables

我正在學習 SQL (postgres)並嘗試將記錄插入到引用其他兩個表中的記錄作為外鍵的表中。

以下是我用於創建表和記錄的語法:

-- Create a person table + insert single row
CREATE TABLE person (
    pname VARCHAR(255) NOT NULL,
    PRIMARY KEY (pname)
);
INSERT INTO person VALUES ('personOne');

-- Create a city table + insert single row
CREATE TABLE city (
    cname VARCHAR(255) NOT NULL,
    PRIMARY KEY (cname)
);
INSERT INTO city VALUES ('cityOne');

-- Create a employee table w/ForeignKey reference
CREATE TABLE employee (
    ename VARCHAR(255) REFERENCES person(pname) NOT NULL,
    ecity VARCHAR(255) REFERENCES city(cname) NOT NULL,
    PRIMARY KEY(ename, ecity)
);

-- create employee entry referencing existing records
INSERT INTO employee VALUES(
    SELECT pname FROM person
        WHERE pname='personOne' AND  <-- ISSUE
    SELECT cname FROM city
        WHERE cname='cityOne
);

請注意,在最后一段代碼中,我正在對員工表進行INSERT ,我不知道如何將多個SELECT子查詢串在一起以從 person 和 city 表中獲取現有記錄,這樣我就可以創建一個新的員工條目,其屬性如下:

ename='personOne' ecity='cityOne'

我為 class 准備的教科書沒有深入研究這樣的子查詢,我找不到任何與我的足夠相似的示例,這樣我就可以理解如何為這個用例調整它們。

洞察力將不勝感激。

城市和人之間似乎沒有任何明顯的關系,這會讓你的生活變得艱難

將具有兩個提供信息的基表的 select 轉換為插入的一般模式是:

INSERT INTO table(column,list,here)
SELECT column,list,here 
FROM
  a 
  JOIN b ON a.x = b.y

在您的情況下,實際上沒有什么可以加入的,因為您的單列表沒有共同的列。 cityname中提供例如城市名稱(因為一個城市似乎更有可能有很多人)然后你可以做

INSERT INTO employee(personname,cityname)
SELECT p.pname, c.cname  
FROM
  person p
  JOIN city c ON p.cityname = c.cname 

但即便如此,這些表之間是相互關聯的,不需要第三張表,所以這可能只是一種學術練習,而不是你在現實世界中要做的事情

如果您只想將每個人與每個城市混合在一起,您可以這樣做:

INSERT INTO employee(personname,cityname)
SELECT pname, cname 
FROM
  person p
  CROSS JOIN city c 

但是要注意,兩個人和兩個城市會導致插入4行,依此類推(20個人和40個城市,800行。相當沒用的恕我直言)

但是,我相信首先顯示的一般模式足以滿足您的學習需求; 寫一個 SELECT 顯示您要插入的數據,然后只需在其上方寫入INSERT INTO table(columns) 插入的列數必須與選定的列數匹配。 不要忘記,如果查詢中沒有任何列包含信息( INSERT INTO X(p,c,age) SELECT personname, cityname, 23 FROM...

以下內容將為您工作:

INSERT INTO employee
SELECT pname, cname FROM person, city
WHERE pname='personOne' AND cname='cityOne';

這是一個cross join ,產生兩個表的笛卡爾積(因為沒有任何東西可以鏈接兩者)。 它讀起來有點奇怪,因為您可以很容易地直接插入這些值。 但我認為這是因為這是一個學習練習。

請注意,您的創建員工中有一個錯字。 您在主鍵之前缺少一個逗號。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM