2012-11-29 85 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列。