0

使用平台:

SQL Server 2008 和 C++ 生成器

我正在两个表之间进行内部连接,这给了我一个错误:

找不到要更新的行

询问:

SELECT DISTINCT  
    b.Acc, b.Region, b.Off, b.Sale, a.OrgDate
FROM 
    sales b
INNER JOIN 
    dates a ON (a.Acc = b.Acc and a.Region = b.Region and a.year= b.year)
WHERE
    (a.xdate <> a.yDate)
    and (b.Sale = a.SaleDate)
    and b.year = 2010

注意:Acc, Region,Off是表 b 的主键,也存在于表 a 中。

表 a 有一个 id,它是查询中没有出现的主键。

事实证明,我的内部联接正在返回重复的行。

我将内部联接查询更改为使用“DISTINCT”,以便只返回不同的行而不是重复的。查询运行,但随后出现错误:

用于更新或刷新的键列信息不足。

事实证明,表 A 中的主键字段与表 B 中的字段名称相同

我发现这是在更新 ADO 记录集时发生的错误。BUG:当连接表共享相同的列名时更新 ADO 分层记录集出现问题

我有以下两个问题:

  1. 在内部联接查询上使用 Distinct 不是一个好主意吗?
  2. 有没有人找到与 TADO 查询相关的错误的解决方案?

谢谢,

4

1 回答 1

0

我解决这个问题的方法是手动构建一个更新查询并通过 TADOQuery.ExecSQL 运行它。这假设您实际上知道自己在做什么。

问题是您为什么要处理在所有字段上导致同一行的倍数的记录集?您应该检查您的查询并修复它。DISTINCT 没有帮助,因为 SQL Server 选择了一条记录,但 ADO 不知道它选择了哪一条,因为没有足够的信息来正确识别 JOIN 每一侧的源。


此查询a.id用于使源记录可识别:

SELECT Acc,Region,Off,Sale,OrgDate,id
  FROM
(
SELECT b.Acc,b.Region,b.Off,b.Sale,a.OrgDate, a.id,
       rn=row_number() over (partition by b.Acc,b.Region,b.Off order by a.id asc)
  FROM sales b
  JOIN dates a ON(a.Acc = b.Acc and a.Region = b.Region and a.year= b.year)
 WHERE a.xdate <> a.yDate
   and b.Sale = a.SaleDate
   and b.year = 2010
) X
 WHERE rn=1;

未经测试,但它应该适用于 ADO

于 2012-09-30T20:33:18.423 回答