发布到表格时出错

时间:2012-09-30 20:27:58

标签: sql

使用的平台:

SQL Server 2008和C ++ Builder

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

  无法找到

行以进行更新

查询:

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

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

表a有一个id,它是主键,不会出现在查询中。

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

我将内部联接查询更改为使用“DISTINCT”,以便仅返回不同的行而不重复。查询运行但后来我收到错误:

  

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

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

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

我有以下两个问题:

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

1 个答案:

答案 0 :(得分: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配合使用