使用的平台:
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
注意:Acc
,Region
,Off
是表b的主键,也存在于表a中。
表a有一个id,它是主键,不会出现在查询中。
事实证明我的内连接正在返回重复的行。
我将内部联接查询更改为使用“DISTINCT”,以便仅返回不同的行而不重复。查询运行但后来我收到错误:
用于更新或刷新的键列信息不足。
事实证明,表A中主键的字段与表B中的字段具有相同的名称
我发现这是更新ADO记录集时发生的错误。 BUG:连接表共享相同列名时更新ADO分层记录集的问题
我有以下两个问题:
谢谢,
答案 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配合使用