Выполнение игнорирования обновления в SQL Server 2005 - PullRequest
2 голосов
/ 16 марта 2011

У меня есть таблица, в которой я хочу обновить некоторые строки.Все поля не являются нулевыми.Я делаю подзапрос и хочу обновить таблицу с ненулевыми результатами.

См. Ниже мой окончательный ответ: В MySQL я решаю эту проблему, выполняя ОБНОВЛЕНИЕ ИГНОРИРОВАНИЯ.Как мне заставить это работать в 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

Если я добавлю «И символ.НЕТ НЕДЕЙСТВИТЕЛЕН» к ГДЕ, где я получаю ошибку SQL.Если я запускаю его как есть, я получаю ошибки «добавление нуля в ненулевой столбец».: - (

Спасибо всем, в итоге я нашел это:

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,

Greg

Ответы [ 2 ]

2 голосов
/ 16 марта 2011
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

это полностью обрабатывает нуль, так как все отфильтрованы предикатом where (также может быть отфильтрован предикатом объединения, если вы хотите.

0 голосов
/ 16 марта 2011

Вот еще один вариант, при котором только те строки в #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?

(Могут быть некоторые проблемы с синтаксисом, без таблиц я не могу его отладить)

...