2011-03-16 54 views
2

我有一張表,希望更新一些行。所有的字段都不爲空。我正在做一個子查詢,我希望用非空結果更新表。在SQL Server 2005中執行更新忽略

查看下面我的最終答案: 在MySQL中,我通過執行UPDATE IGNORE來解決此問題。我如何在SQL Server 2005中完成這項工作?子查詢使用四表連接來查找要插入的數據(如果存在)。更新是針對可能有90,000個記錄的表運行的,所以我需要一個使用SQL的解決方案,而不是讓查詢數據庫的Java程序檢索結果,然後更新那些非空的字段值。

更新:我的查詢:

UPDATE #SearchResults SET geneSymbol = (
    SELECT TOP 1 symbol.name FROM 
     GeneSymbol AS symbol JOIN GeneConnector AS geneJoin 
      ON symbol.id = geneJoin.geneSymbolID 
     JOIN Result AS sSeq ON geneJoin.sSeqID = sSeq.id 
     JOIN IndelConnector AS joiner ON joiner.sSeqID = sSeq.id 
    WHERE joiner.indelID = #SearchResults.id ORDER BY symbol.id ASC) 
WHERE isSNV = 0 

如果我添加 「symbol.name IS NOT NULL」 要麼在那裏我得到一個SQL錯誤。如果我按原樣運行,則會出現「向非空列添加null」錯誤。 :-(

謝謝大家,我最終找到這樣的:

UPDATE #SearchResults SET geneSymbol = 
    ISNULL ((SELECT TOP 1 symbol.name FROM 
     GeneSymbol AS symbol JOIN GeneConnector AS geneJoin 
      ON symbol.id = geneJoin.geneSymbolID 
     JOIN Result AS sSeq ON geneJoin.sSeqID = sSeq.id 
     JOIN IndelConnector AS joiner ON joiner.sSeqID = sSeq.id 
    WHERE joiner.indelID = #SearchResults.id ORDER BY symbol.id ASC), ' ') 
WHERE isSNV = 0 

雖然這將是最好不要在空的情況下做什麼(所以我會試着去了解其他的答案,並查看它們是否更快)將空案例設置爲空白答案也行得通,這就是它的作用

注意:用()包裝ISNULL(...)會導致真正模糊(和錯誤)錯誤。

TIA,

格雷格

+0

你能更準確? YOu在更新語句中有一個where子句,YOu可以過濾出空行,並且您可以引用在用於更新的聯合中更新的表。 – luckyluke 2011-03-16 02:55:37

+0

「YOu在更新語句中有where子句,YOu可以過濾出空行」How?我將在下面粘貼我的連接,但是我沒有看到在其中過濾NULL的方法,TSQL不會讓我在它外面過濾NULL。 – 2011-03-16 13:58:17

+1

RBAR順便說一句,你應該避免, – luckyluke 2011-03-16 14:15:32

回答

2
with UpdatedGenesDS (
select joiner.indelID, name, row_number() over (order by symbol.id asc) seq 
from 
GeneSymbol AS symbol JOIN GeneConnector AS geneJoin 
      ON symbol.id = geneJoin.geneSymbolID 
     JOIN Result AS sSeq ON geneJoin.sSeqID = sSeq.id 
     JOIN IndelConnector AS joiner ON joiner.sSeqID = sSeq.id 
WHERE name is not null ORDER BY symbol.id ASC 
) 
update Genes 
set geneSymbol = upd.name 
from #SearchResults a 
inner join UpdateGenesDs upd on a.id = b.intelID 
where upd.seq =1 and isSNV = 0 

這完全處理所有由地方謂詞過濾掉空(也可以通過,如果你想加入謂詞進行過濾。你在找什麼?

+0

我不知道。這可以作爲SQL執行嗎?因爲我已經在MSDN中搜索了UpdateDataSet「SQL Server」和「with UpdateDataSet」,以瞭解在SQL中使用它的實際示例,並且找不到一個。 – 2011-03-16 13:58:42

+0

這工作得很好。 IT被稱爲公共表格表達。此代碼是合法的 – luckyluke 2011-03-16 14:01:26

+2

@Greg - UpdateDataSet是luke選擇命名其公用表達式(CTE)的名稱。所以在MSDN上找不到對它的引用並不奇怪。 – 2011-03-16 14:08:05

0

這是另一個選項,其中只有#SearchResults中成功連接的那些行將被取消。如果在底層數據中有空值,那麼內部連接將不會引入空值,您不必擔心將其過濾掉。

UPDATE #SearchResults 
set geneSymbol = symbol.name 
from #SearchResults sr 
    inner join IndelConnector AS joiner 
    on joiner.indelID = sr.id 
    inner join Result AS sSeq 
    on sSeq.id = joiner.sSeqID 
    inner join GeneConnector AS geneJoin 
    on geneJoin.sSeqID = sSeq.id 
    -- Get "lowest" (i.e. first if listed alphabetically) value of name for each id 
    inner join (select id, min(name) name 
       from GeneSymbol 
       group by id) symbol 
    on symbol.id = geneJoin.geneSymbolID  
where isSNV = 0 -- Which table is this value from? 

(可能有一些語法問題,沒有桌子,我不能對它進行調試)

+0

isSNV來自#SearchResults(這是一個標誌。如果isSNV是1,我必須爲第一次連接使用不同的表格)。雖然你的想法很好,但不幸的是這不起作用。問題是在GeneConnector中可能有多個具有相同sSeqID的條目,但是不同的geneSymbolIds(即表格的整個點,以允許Result具有關聯基因的列表)。你所選擇的內部選項是重新創建GeneSymbol表(它每個ID只有一個名稱)。所以當它遇到一個ID會多個GeneSymbols時,它就會失敗。 – 2011-03-16 17:27:20