2011-03-16 5 views
2

일부 행을 업데이트하려는 테이블이 있습니다. 모든 필드가 null이 아닙니다. 하위 쿼리를 수행하고 있으며 Null이 아닌 결과로 테이블을 업데이트하려고합니다.SQL Server 2005에서 업데이트 무시 수행

아래 내 최종 답변을 참조하십시오 : MySQL에서는 UPDATE IGNORE를 수행하여이 문제를 해결합니다. SQL Server 2005에서이 작업을 수행하려면 어떻게해야합니까? 하위 쿼리는 4 테이블 조인을 사용하여 삽입 할 데이터를 찾습니다. 데이터베이스를 쿼리하는 Java 프로그램에서 결과를 검색 한 다음 Null이 아닌 필드를 업데이트하지 않고 SQL을 사용하는 솔루션이 필요하므로 업데이트가 90,000 개 이상의 레코드를 가질 수있는 테이블에 대해 실행되고 있습니다. 값.

업데이트 : 내 쿼리 : 나는 추가 "symbol.name가 NULL이"중 나는 SQL 오류가 WHERE에 경우

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 

. 만약 내가 그것을 실행하면 "null이 아닌 열에 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는 null 행을 필터링 할 수있는 update 문에서 where 절을 사용하며, 업데이트에 사용 된 조인에서 업데이트 된 테이블을 참조 할 수 있습니다. – luckyluke

+0

"YOU는 null 행을 필터링 할 수있는 update 문에서 where 절을 사용합니다."어떻게? 내가 아래에 내 조인을 붙여 넣을거야,하지만 그 안에 NULL을 필터링하는 방법을 볼 수 없습니다, 그리고 TSQL 나를 그것 밖에 NULL을 필터링 할 수 없습니다. –

+1

그 RBAR btw, 당신은 그 – luckyluke

답변

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 

이 모두이 곳 조건에 의해 필터링 완전히로 널 (null)을 처리 (또한 원하는 경우 조인 조건에 의해 필터링 할 수 있습니다. 그것은 당신이 찾고있는 것입니까?

+0

잘 모르겠다. SQL로 실행할 수 있습니까? SQL에서이 예제를 사용하는 실제 예를 보려면 MSDN에서 UpdateDataSet "SQL Server"와 "UpdateDataSet"을 검색 했으므로 하나만 찾을 수 없습니다. –

+0

이것은 완벽하게 작동합니다. IT를 공통 테이블 표현이라고합니다. 이 코드는 유효합니다 – luckyluke

+2

@Greg - UpdateDataSet은 루크가 CTE (Common Table Expression)의 이름을 지정하기 위해 선택한 이름입니다. 따라서 MSDN에서이 참조를 찾을 수 없다는 것은 놀라운 일이 아닙니다. –

0

여기에 또 다른 옵션이 있습니다. 여기에는 #SearchResults에서 성공적으로 연결된 행만 표시됩니다. 내부 데이터에 값이 없으면 내부 조인은 null 값을 가져 오지 않으므로 필터링을 걱정하지 않아도됩니다.

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가 다른 여러 항목이있을 수 있다는 것입니다 (결과가 연관된 유전자의 목록을 가질 수 있도록 테이블의 전체 점임). 내부 선택 모두는 GeneSymbol 테이블을 다시 생성합니다 (이미 ID 당 하나의 이름 만 가지고 있습니다). 따라서 ID로 실행되면 여러 개의 GeneSymbols가 실패합니다. –

관련 문제