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

标签 sql postgresql join

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

相关文章:

node.js - 如何使用 nodejs + pg 进行区分大小写的查询

sql - 如何连接条件不相等的表?

SQL 错误 : 904, SQLState: 42000 ORA-00904::无效标识符

sql - 连接多个表 : where to filter efficiently

postgresql - 如何通过 Spark 中的 jdbc 连接到 docker 托管的 postgresql 数据库?

mysql - Rails 从两个表中的关联加入

Mysql 连接与使用相关名称的子查询连接

sql - 重命名SQLServer中的表名

c# - 需要在 Linq 中执行子查询

mysql - Mysql 数据透视表