如何用其他表中的不同值更新多行?

艾伦

我有3个表,其中两个包含日期,最后一个表正试图从这些表中获取数据。但是,其中两个列(如果不计算id列)包含数据,只有此表具有。

因此,我想做的是通过一次多次更新来从其他表中导入数据。

这些表具有以下结构:

test1(
  id_test1 serial NOT NULL,
  typeactemariage character varying(200) NOT NULL,
  datemariage character varying(200),
  id_lieumariage integer,
  id_conjoint integer,
  id_beaupere integer,
  id_bellemere integer,
  CONSTRAINT test1_pkey PRIMARY KEY (id_test1)
)

test2
(
  id_test2 serial NOT NULL,
  ville character varying(200),
  departement character varying(200) NOT NULL,
  CONSTRAINT test2_pkey PRIMARY KEY (id_test2)
)

test3
(
  id_test3 serial NOT NULL,
  typeacte character varying(100) NOT NULL,
  epoux character varying(100) NOT NULL,
  prenomepoux character varying(100),
  prenompereepoux character varying(100),
  nommereepoux character varying(100),
  prenommereepoux character varying(100),
  epouse character varying(100),
  prenomepouse character varying(100),
  prenompereepouse character varying(100),
  nommereepouse character varying(100),
  prenommereepouse character varying(100),
  lieu character varying(150) NOT NULL,
  dept character varying(100) NOT NULL,
  dates character varying(30),
  numvue character varying(100),
  CONSTRAINT test3_pkey PRIMARY KEY (id_test3)
)

TEST1已经具有在列中的数据typeactemariagedatemariage(和id_test1),以从带的数据,并尝试TEST2(id_test2)在塔(id_lieumariage) 目前其他列仍为空。

这是我写的:

UPDATE
    test1 
SET
    id_lieumariage = l.id_test2
FROM
    test1 m,
    test2 l,
    test3 o
WHERE
    o.id_test3 = m.id_test1
    AND o.lieu = l.ville
    AND o.dept = l.departement;

代码执行后,该列中有数据,但仅使用看到的第一个值(在第1行)进行取回,这不是我想要的。有什么办法可以使其循环,以便在每一行上进行此更新?

谢谢 !


编辑:我正在放我的桌子的图片,并将尝试更好地解释。

test1:http : //puu.sh/scVCy/8479b7e4f2.png

测试2:http://puu.sh/scVmL/901df2d74a.png

TEST3:http://puu.sh/scVoz/04be151c71.png

我的代码执行后测试1:http://puu.sh/scVpC/3209b5f4a6.png

该id_lieumariage柱填充本身与它获得的第一个值,1使用我的代码,我期望第一行的值为1,第二行的值为2,第三行的值为3。

我有大约100k +的值需要导入(我这里只显示了3行,以简化示例)。

所以,我需要的东西,是能够得到不同的id_lieumariage值的每一行。告诉我,如果你不明白我的解释,我没有一个很好的英语。


编辑2:我要提供我的数据:

CREATE TABLE test1()
ALTER TABLE test1 ADD COLUMN id_test1 SERIAL PRIMARY KEY, ADD COLUMN typeactemariage VARCHAR(200) NOT NULL, ADD COLUMN datemariage VARCHAR(200), ADD COLUMN id_lieumariage INTEGER, ADD COLUMN id_conjoint INTEGER, ADD COLUMN id_beaupere INTEGER, ADD COLUMN id_bellemere INTEGER;

CREATE TABLE test2()
ALTER TABLE test2 ADD COLUMN id_test2 SERIAL PRIMARY KEY, ADD COLUMN ville VARCHAR(200), ADD COLUMN departement VARCHAR(200) NOT NULL*;

CREATE TABLE test3()
ALTER TABLE test3 ADD COLUMN id_test3 SERIAL PRIMARY KEY, ADD COLUMN typeacte VARCHAR(200) NOT NULL, ADD COLUMN epoux VARCHAR(200), ADD COLUMN prenomepoux VARCHAR(200), ADD COLUMN prenompereepoux VARCHAR(200), ADD COLUMN nommereepoux VARCHAR(200), ADD COLUMN prenommereepoux VARCHAR(200), ADD COLUMN epouse VARCHAR(200), ADD COLUMN prenomepouse VARCHAR(200), ADD COLUMN nommereepouse VARCHAR(200), ADD COLUMN prenommereepouse VARCHAR(200), ADD COLUMN lieu VARCHAR(200), ADD COLUMN dept VARCHAR(200), ADD COLUMN dates VARCHAR(200), ADD COLUMN numvue VARCHAR(200);

INSERT INTO test1(typeactemariage, datemariage, id_lieumariage, id_conjoint, id_beaupere, id_bellemere)
VALUES ('Contrat de mariage', '21/11/2016', NULL, NULL, NULL, NULL),
('Contrat de mariage', '25/11/2016', NULL, NULL, NULL, NULL)
('Contrat de mariage', '11/11/2016', NULL, NULL, NULL, NULL);

INSERT INTO test2(ville, departement)
VALUES('Royan', '17'),
('Rochefort', '17'),
('Aytre', '17');

INSERT INTO test3(typeacte, epoux, prenomepoux, prenompereepoux, nommereepoux, prenommereepoux, epouse, prenomepouse, prenompereepouse, nommereepouse, prenommereepouse, lieu, dept, dates, numvue)
VALUES ('Contrat de mariage', 'DUPOND', 'Loris', 'Jacques', 'Duponne', 'Jeanne', 'BOURDOIN', 'Manon', 'Dujonni', 'Jinny', 'Royan', '17', '11/11/2016', '10/70'),
('Contrat de mariage', 'DUPONT', 'Pierre', 'Jerome', 'Dupuits', 'Jeannette', 'BOURLIAN', 'Philippine', 'Marpa', 'Elisa', 'Rochefort', '17', '21/11/2016', '10/20'),
('Contrat de mariage', 'Tintin', 'Milou', 'Haddock', 'Bond', 'Barack', 'Dutroux', 'Anna', 'Trane', 'Melissa', 'Aytre', '17', '25/11/2016', '10/25');

执行请求后,我应该拥有的内容如下:

test1的第(1)行:1,Maritra对比,21/11/2016,1,NULL,NULL,NULL

test1的第(2)行:1,Maritra对比,25/11/2016,2,NULL,NULL,NULL

test1的第(3)行:1,Maritra对比,11/11/2016,3,NULL,NULL,NULL

我所得到:

test1的第(1)行:1,Maritra对比,21/11/2016,1,NULL,NULL,NULL

test1的第(2)行:1,Maritra对比,25/11/2016,1,NULL,NULL,NULL

test1的第(3)行:1,Maritra对比,11/11/2016,1,NULL,NULL,NULL

我的代码在做什么,它采用找到的第一个l.id_test2,并将其放在每一行中。如果我将请求修改为:

UPDATE
    test1 
SET
    id_lieumariage = l.id_test2
FROM
    test1 m,
    test2 l,
    test3 o
WHERE
    o.id_test3 = m.id_test1
    AND o.lieu = l.ville
    AND o.dept = l.departement
    AND id_test1 = 2

然后,我得到的是:

test1的第(1)行:1,Maritra对比,21/11/2016,1,NULL,NULL,NULL

test1的第(2)行:1,Maritra对比,25/11/2016,1,NULL,NULL,NULL

test1的第(3)行:1,Maritra对比,11/11/2016,1,NULL,NULL,NULL

告诉我您是否需要更多信息!

克洛多尔多·内托
update test1 m
set id_lieumariage = l.id_test2
from
    test3 o
    inner join
    test2 l on o.lieu = l.ville and o.dept = l.departement
where o.id_test3 = m.id_test1
;

table test1;
 id_test1 |  typeactemariage   | datemariage | id_lieumariage | id_conjoint | id_beaupere | id_bellemere 
----------+--------------------+-------------+----------------+-------------+-------------+--------------
        1 | Contrat de mariage | 21/11/2016  |              1 |             |             |             
        2 | Contrat de mariage | 25/11/2016  |              2 |             |             |             
        3 | Contrat de mariage | 11/11/2016  |              3 |             |             |             

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章