2017-04-13 127 views
0

我想基于查找表更新事实表。事实表的Addressid需要更新并且替换为查找列的newaddress并且与查找表的oldaddress列进行比较。SQL UPDATE语句中的错误

我已经写了下面的SQL语句:

Update [dbo].[fact_P] 
Set Address_Id = (Select AddressID_new 
        From AddressLookup 
        Where fact_P.Address_Id = Lookup.AddressID_old) 

但它抛出一个错误。

+1

您正在使用哪个数据库管理系统? –

+0

@a_horse_with_no_name它看起来像SQL Server或Access,我倾向于前者。但我不认为这个错误是数据库特定的。 –

+3

***你有什么***错误?记住:我们**不能**看到你的屏幕,也不能**阅读你的想法** - 你将不得不**告诉我们!** –

回答

0

您在子查询中使用错误的别名/表名引用AddressID_old列。如果我没有弄错,你应该使用AddressLookup.Address_ID_old来代替。

UPDATE [dbo].[fact_P] 
SET Address_Id = (SELECT AddressID_new FROM AddressLookup al 
        WHERE fact_P.Address_Id = al.AddressID_old) 
0

使用下面的查询UPDATE语句:

UPDATE [dbo].[fact_P] SET Address_Id = AddressID_new 
    FROM AddressLookup al 
    WHERE fact_P.Address_Id = al.AddressID_old 
0
在部分子查询,只有当它返回值1允许

。所以,如果我不是你的名字表错误理解查询是“AddressLookup”,你需要加入:

Update fp 
set fp.Address_Id=al.AddressID_new 
    from [dbo].[fact_P] fp join AddressLookup al 
     on fp.Address_Id= al.AddressID_old 
0
Update tgt 
set Address_Id = lu.Address_Id 
from [dbo].[fact_P] tgt 
inner join AddressLookup lu 
on tgt.Address_Id = lu.AddressID_old; 
+0

谢谢它工作,但它需要很长时间,因为数据是巨大的,我们可以使用合并而不是以更快的速度运行任何想法 – user7854107

+0

当你同时从源表插入或更新目标表时需要使用合并。无论如何,我认为这不会增加业绩。你可以尝试做适当的索引。 – Biswabid