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) 条记录没有更新?!谢谢你的帮助。

4

3 回答 3

1

显然,您的内部 select 语句返回 331 行,其中 325 行已成功加入tableAvia ON A.c_id = X.c_id。因此,大概有 6 行从您的内部选择返回的行与 in 的行不匹配tableA,因此被删除(因为它不是 OUTER JOIN)。

于 2012-04-04T16:48:16.117 回答
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 行

于 2012-04-04T16:49:16.010 回答
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

于 2012-04-04T16:48:11.123 回答