选择查询不同的级别表

时间:2017-05-03 09:19:56

标签: sql postgresql join

我有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,它在概念上并不是很复杂,所以我猜有一种简单的方法可以做到这一点,我还没有找到它。任何线索?

由于

1 个答案:

答案 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