我有 4 张 table 。其中 2 个存储属性数据(一个存储每条街道的名称和代码,另一个链接到第一个但添加街道编号)如下:
CREATE TABLE public.adresse
(
id_adress serial NOT NULL,
nb_street character varying(10),
id_street integer,
CONSTRAINT prk_constraint_adresse PRIMARY KEY (id_adresse),
CONSTRAINT fk_adresse_id_street FOREIGN KEY (id_street)
REFERENCES public.street (id_street) MATCH SIMPLE
);
CREATE TABLE public.street
(
id_street serial NOT NULL,
name_street character varying(25),
code_street character varying(25),
CONSTRAINT prk_constraint_street PRIMARY KEY (id_street)
);
另外 2 个表与建筑物相关,它们存储的数据相似,但已标准化以适合我的数据库:一个我想插入来自另一个从 csv 复制的数据。从csv复制出来的是这样的
ID_BULDING; CODE_STREET; NB_STREET; NAME_STREET;
34001; 0265; 44; ALL DU TURET;
35001; 0265; 40; ALL DU TURET;
38001; 0245; 12; IMP DES SERINGATS;
39001; 0245; 28; IMP DES SERINGATS;
还有我要插入的那个:
CREATE TABLE public.built
(
id_built serial NOT NULL,
id_building character varying(40),
id_adresse integer,
CONSTRAINT prk_constraint_bal PRIMARY KEY (id_built),
CONSTRAINT fk_bal_id_adresse FOREIGN KEY (id_adresse)
REFERENCES public.adresse (id_adresse) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
)
结果表看起来像这样:
ID_STREET; NAME_STREET; CODE_STREET;
1; ALL DU TURET; 0265;
2; IMP DES SERIGNATS 0245;
ID_ADRESSE; NB_STREET; ID_STREET;
1; 44; 1;
2; 40; 1;
3; 12; 2;
4; 28; 2;
ID_BULDING; ID_ADRESSE;
34001; 1;
35001; 2;
38001; 3;
39001; 4;
正如您所看到的,在插入的表中有一个外键“id_adresse”,正如您可能想象的那样,我想填充符合表“adresse”中找到的标准的“id_adresse”表“voie”。但是我不知道如何实现这样的三级查询。我尝试了一些查询,但我不知道如何在连接中间声明表“地址”。现在我被困在这里:
INSERT INTO public.built(id_building, id_adresse)
SELECT id_building, adresse.id_adresse
FROM public.building
LEFT JOIN public.street
ON street.name_street=building.name_street
AND street.code_street=building.code_street;
我是 SQL 领域的新手,使用 PostgreSQL 9.5,它在概念上并不复杂,所以我猜有一种简单的方法可以做到这一点,只是我还没有找到它。有什么线索吗?
谢谢
最佳答案
瞧 ;)
INSERT INTO built(id_building, id_adresse)
SELECT B.id_building, A.id_adresse
FROM building B
LEFT JOIN street S ON S.code_street=B.code_street
LEFT JOIN adresse A ON A.id_street=S.id_street AND A.nb_street = B.nb_street ;
在这里测试(没有参照完整性):SQL Fiddle
关于sql - 选择查询不同级别的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43755950/