gpt4 book ai didi

sql - 选择查询不同级别的表

转载 作者:行者123 更新时间:2023-11-29 13:19:58 25 4
gpt4 key购买 nike

我有 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com