2012-04-04 71 views
1

我有下面的查询,当它运行时说,有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)记录没有得到更新?!谢谢你的帮助。

回答

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 

本质上讲,这是左连接,而你只返回在左连接不存在的行。它应该告诉你哪些6行从表A中缺失

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

1

显然你内心的SELECT语句返回331行,其中325成功通过ON A.c_id = X.c_id加入到tableA。所以大概有6个从你的内部select返回的行与tableA中的行不匹配,因此被丢弃(因为它不是OUTER JOIN)。

相关问题