2015-11-02 63 views
1

我有两个表,更新表加入对临时表

tblFXRates

Base Quote Rate 
    USD  JPY  1.5  
    USD  GBP  2.5 
    USD  EUR  1.75 
    EUR  JPY  1.5 
    USD  USD  1 

tblHoldings

FX  FXRate 
EUR  null 
EUR  null 
USD  null 
GBP  null 
JPY  null 

我想什么做的是更新FXRate在tblHoldings中。所以我想选择tblFXRates中基数等于USD的所有利率。然后将此查询的结果加入到tblHoldings中的FX列以更新FXRate。它应该看起来像下面,

结果

FX  FXRate 
EUR  1.75 
EUR  1.75 
USD  1 
GBP  2.5 
JPY  1.5 

我不知道如何做到这一点的嵌套查询扔我。我的尝试到目前为止(是相当rubish)如下,

update h 
set h.FXRate = fx.rate 
from tblHoldings h 
inner join fx 
on h.FX = fx.Quote 
with fx as 
( 
    select quote, rate 
    from tblFxRates 
    where base = 'USD' 
) 

回答

1

您可以使用UPDATE FROM JOIN

UPDATE th 
SET FXRate = tr.Rate 
FROM #tblHoldings th 
JOIN #tblFXRates tr 
    ON th.FX = tr.Quote 
WHERE tr.Base = 'USD'; 

LiveDemo

输出:

╔═════╦════════╗ 
║ FX ║ FXRate ║ 
╠═════╬════════╣ 
║ EUR ║ 1.75 ║ 
║ EUR ║ 1.75 ║ 
║ GBP ║ 2.5 ║ 
║ JPY ║ 1.5 ║ 
║ USD ║ 1  ║ 
╚═════╩════════╝ 

另外,您可以使用MERGE声明:

MERGE #tblHoldings AS th 
USING #tblFXRates tr 
    ON th.FX = tr.Quote 
WHEN MATCHED AND tr.Base = 'USD' THEN 
    UPDATE SET FXRate = tr.Rate; 

LiveDemo2

它可以检测像重复数据损坏:

INSERT INTO #tblFXRates(Base,Quote,Rate) VALUES ('USD','USD',1); 
INSERT INTO #tblFXRates(Base,Quote,Rate) VALUES ('USD','USD',2); 

使用UPDATE它静静地通过。

+0

啊是的,真的没有必要嵌套!合并对我来说是新东西,所以谢谢你 – mHelpMe

1

试试这个。

update h 
set h.FXRate = fx.rate 
from tblHoldings h 
inner join tblfxrates f on h.FX = f.Quote 
where h.base = 'USD' 
1

我想这是你想要的东西:

update h 
    set h.FXRate = fx.rate 
    from tblHoldings h inner join 
     fx 
     on h.FX = fx.Quote and fx.base = 'USD';