我有3张相关的表格。成人,儿童和AC。成人包含一个INT专栏,可以计算高中毕业生的数量。孩子们有一个年级高中毕业的专栏。 AC将adult.id链接到children.id。
CREATE TABLE adults (
id INT,
name VARCHAR(10),
seniors INT DEFAULT 0
) ;
INSERT INTO adults (id, name) VALUES
(1, 'adam'),
(2, 'bob');
CREATE TABLE children (
id INT,
name VARCHAR(10),
grad VARCHAR(4)
) ;
INSERT INTO children (id, name, grad) VALUES
(1, 'sally', '2016'),
(2, 'johnny', '2017'),
(3, 'eric', '2016'),
(4, 'billy', '2016'),
(5, 'rachel', '2016');
CREATE TABLE pc (
id INT,
a_id INT,
c_id INT
) ;
INSERT INTO pc (id, a_id, c_id) VALUES
(1, 1, 1),
(2, 1, 2),
(3, 1, 3),
(4, 2, 3),
(5, 2, 2);
SQLFiddle:http://sqlfiddle.com/#!2/89281e
因此,我希望将成年人的年龄更新为2016年的数量'他们与之相关的孩子。成年人#1将是" 2" (莎莉和埃里克),成人#2" 1" (ERIC)。
实际数据将在25,000多名儿童中进行,这些儿童最多可与40,000多名父母匹配,并在#34; pc"超过3,000,000行的表 - 所以寻找效率。我开始沿着这条路走下去但a)由于明显的原因它没有工作,b)我怀疑它会有效......
UPDATE adults a SET
seniors = (
SELECT p.a_id, count(*)
FROM pc p
INNER JOIN children c ON c.id = p.c_id
WHERE c.grad = '2016'
GROUP BY p.c_id)
WHERE p.a_id = a.id;
我认为必须有一种更好的方式来实现这种连接,但似乎无法绕过它。
答案 0 :(得分:1)
您应该寻找此更新声明:
UPDATE adults a
JOIN
(SELECT
p.a_id, COUNT(*) childrencount
FROM
pc p
INNER JOIN children c ON c.id = p.c_id
WHERE
c.grad = '2016'
GROUP BY p.a_id) c ON (a.id = c.a_id)
SET
seniors = c.childrencount;