我有4张桌子。其中2个存储属性数据(一个存储每个街道的名称和代码,另一个链接到第一个但添加街道号码):
const data = [1, "milk"];
其他2个表与建筑物相关,在它们存储的数据中类似,但规范化以适合我的数据库:其中一个我要插入来自另一个从csv复制的数据。从csv复制的那个就像这样
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)
);
我要插入的那个:
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_adresse",您可以想象我想填写" id_adresse"符合表格中的标准" adresse"相应地与表" voie"。但我无法弄清楚如何实现这样的三级查询。我尝试了一些查询,但我不知道如何申报表格#34; adresse"在连接的中间。现在我被困在这里:
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;
我在SQL世界中很新,使用PostgreSQL 9.5,它在概念上并不是很复杂,所以我猜有一种简单的方法可以做到这一点,我还没有找到它。任何线索?
由于
答案 0 :(得分:1)
Voila;)
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