【发布时间】:2016-11-09 18:13:41
【问题描述】:
我有 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 已经在 typeactemariage 和 datemariage 列(以及 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 行),这不是我想要的。有没有办法让它循环,对每一行进行更新?
谢谢!
编辑:我正在放我的桌子的照片,并会尝试更好地解释。
测试1:http://puu.sh/scVCy/8479b7e4f2.png
测试2:http://puu.sh/scVmL/901df2d74a.png
测试3:http://puu.sh/scVoz/04be151c71.png
执行我的代码后的test1: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');
在执行我的请求后我应该拥有以下内容:
第 (1) 行 test1 : 1,Contrat de mariage, 21/11/2016, 1, NULL, NULL, NULL
第 (2) 行 test1 : 1,Contrat de mariage, 25/11/2016, 2, NULL, NULL, NULL
第 (3) 行 test1 : 1,Contrat de mariage, 11/11/2016, 3, NULL, NULL, NULL
我得到了什么:
第 (1) 行 test1 : 1,Contrat de mariage, 21/11/2016, 1, NULL, NULL, NULL
第 (2) 行 test1 : 1,Contrat de mariage, 25/11/2016, 1, NULL, NULL, NULL
第 (3) 行 test1 : 1,Contrat de mariage, 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
那么,我得到的是:
第 (1) 行 test1 : 1,Contrat de mariage, 21/11/2016, 1, NULL, NULL, NULL
第 (2) 行 test1 : 1,Contrat de mariage, 25/11/2016, 1, NULL, NULL, NULL
第 (3) 行 test1 : 1,Contrat de mariage, 11/11/2016, 1, NULL, NULL, NULL
如果您需要更多信息,请告诉我!
【问题讨论】:
-
test3表create和insert代码存在几个问题。更正并重新发布。 -
是的,我的错。已更正。
标签: sql database postgresql