如何找出返回不同结果的两个查询之间的差异

时间:2012-04-04 16:44:25

标签: sql database select

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

3 个答案:

答案 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