我在下面的查询中说,在运行时它说有325行受到影响。但是,如果我只运行查询的SELECT部分,则返回331结果。这意味着当整个查询运行时,只有325行得到更新,而不是331.我不确定这种差异是什么。我希望它更新它在查询的SELECT部分中找到的所有行
此更新导致325行更新
UPDATE A
SET
A.status = X.c
FROM
tableA A INNER JOIN (
SELECT tableB.c_id, COUNT(*) as c
FROM tableB
LEFT JOIN tableC
ON tableB.c_id = tableC.c_id
WHERE tableC.c_id != tableC.c_id_update
GROUP BY tableB.c_id) X
ON A.c_id = X.c_id
只运行查询的SELECT部分返回331行
SELECT tableB.c_id, COUNT(*) as c
FROM tableB
LEFT JOIN tableC
ON tableB.c_id = tableC.c_id
WHERE tableC.c_id != tableC.c_id_update
GROUP BY tableB.c_id
我真的不知道为什么有6条(331-325)记录没有得到更新?!谢谢你的帮助。
答案 0 :(得分:1)
显然你的内部select语句返回331行,其中325行通过tableA
成功加入ON A.c_id = X.c_id
。因此,大概从内部选择返回的6行与tableA
中的行不匹配,因此被删除(因为它不是OUTER JOIN)。
答案 1 :(得分:1)
可能你加入TableA的连接正在删除6条记录。像这样寻找:
select x.* from
(
SELECT tableB.c_id, COUNT(*) as c
FROM tableB
LEFT JOIN tableC
ON tableB.c_id = tableC.c_id
WHERE tableC.c_id != tableC.c_id_update
GROUP BY tableB.c_id
) X
left join tableA A on A.c_id = X.c_id
where A.C_id is null
基本上这是一个左连接,你只返回左连接不存在的行。它应该告诉你TableA中缺少哪6行
答案 2 :(得分:0)
现在尝试:
select count(*)
FROM
tableA A INNER JOIN (
SELECT tableB.c_id, COUNT(*) as c
FROM tableB
LEFT JOIN tableC
ON tableB.c_id = tableC.c_id
WHERE tableC.c_id != tableC.c_id_update
GROUP BY tableB.c_id) X
ON A.c_id = X.c_id
区别在于inner join