2012-11-29 86 views
1

一旦我运行此查询,我得到以下错误子查询返回多个值。

UPDATE stockloan_feed 
SET CUSIP =( 
     SELECT CUSIP FROM stockloan_feed_cusip_matching 
     WHERE stockloan_feed_cusip_matching.SEDOL = stockloan_feed.SEDOL OR  
     stockloan_feed_cusip_matching.ISIN = stockloan_feed.ISIN) 
WHERE CUSIP IS NULL and date = DATEDIFF(d, 0, GETDATE()-1) 

子查询返回多个值。当子查询遵循=,!=,<,< =,>,> =或当子查询用作表达式时,这是不允许的。

+0

你在你的子查询中有不同的CUSIP吗? – triclosan

+4

尝试阅读错误消息。你想对此做什么?您有多个(可能不同!)值,并且只能设置一个......您没有“告诉”数据库您要从它们中获得哪一个 – ppeterka

+0

在stockloan_feed_cusip_matching表上每行都有(SEDOL,ISIN) ?我认为你在这些值中有重复的部分,这就是你从子查询中获得多于一行的原因。我会写一些查询来查明'stockloan_feed_cusip_matching'表中是否有重复。 – Isaac

回答

2
UPDATE t1 
SET t1.CUSIP = t2.CUSIP 
FROM stockloan_feed t1 
INNER JOIN stockloan_feed_cusip_matching t2 
     ON t2.SEDOL = t1.SEDOL 
     OR t2.ISIN = t1.ISIN 
WHERE t1.CUSIP IS NULL 
    AND t1.date = DATEDIFF(d, 0, GETDATE()-1) 
+0

谢谢马哈茂德!这工作。不幸的是,由于cusip_matching中约有200万行,stockloan_feed中约有20000行,因此这个查询需要花费将近6分钟的时间。你知道如果有任何我可以用更少的时间运行这个查询吗? – user1753675

+0

@ user1753675 ​​ - 据我所知,这是最快的方式。尝试在两个表中的“ISIN”和“SEDOL”中添加索引。或者,你可以就这个问题开始一个新的问题。但是,请尽量清楚。 –

1

很简单,您试图为子查询的结果分配一个列值,但子查询返回多个值。

你可以尝试指定您只想从子查询的第一个结果:

UPDATE stockloan_feed 
SET CUSIP = (SELECT TOP 1 CUSIP 
       FROM stockloan_feed_cusip_matching 
       WHERE stockloan_feed_cusip_matching.SEDOL = stockloan_feed.SEDOL 
         OR stockloan_feed_cusip_matching.ISIN = stockloan_feed.ISIN) 
WHERE CUSIP IS NULL 
     AND date = Datediff(d, 0, Getdate() - 1) 

这并不当然,假设你的子查询返回的所有可能的值是相同的,或者你只是不不介意将哪一个匹配结果分配给您的stockloan_feed.CUSIP列。