2012-09-28 4 views
0

필자는 이중 문에서 Select 1을 사용하여 시스템에 제공되는 새로운 데이터가 실제로 새 것인지 아닌지 확인합니다. 새 것이면 삽입 될 것이고, 그렇지 않으면 데이터베이스에서 업데이트 될 것입니다. .이중에서 1을 선택하십시오 (선택 ....). 테이블이 완전히 비어 있어도 1을 반환합니까?

sql.CommandText = "select 1 from dual where exists (select * from my table where hour = " + hour + " and zone = '" + zone+ "' and date = TO_DATE('" + mydate + "','DD-MM-YY'))" 

문제는 그러나 문을 실행 한 후,이 테이블이 완전히 비어있는 경우에도, 그것을위한 조건이 충족되지 않은 경우에도 1 개 값을 반환한다는 것입니다. 어떻게 이런 일이 일어날 수 있겠습니까? VB, .NET Framework 3.5 및 Oracle 10g를 사용하고 있습니다.

+1

저의 작품 : http://sqlfiddle.com/#!4/6eb12/7 언급하지 않은 것이 있습니까? 업데이트/삽입을 원할 경우 단순히 MERGE 문을 사용하지 않는 것이 어떻습니까? –

+0

내가 본 사례가 실제로 2 개의 테이블을 1로 병합하는 것에 대한 자세한 내용 이었기 때문에 MERGE 문을 사용하지 않기로 결정했습니다. 업데이트/삽입하는 데이터는 실제 데이터베이스가 아닌 XML 파일에서 가져옵니다. – user1676874

+1

"상수"값을 가진 MERGE 문을 쉽게 사용할 수 있습니다. http://sqlfiddle.com/#!4/ed4de/6 –

답변

0

sign(count(1))을 사용하면 계산할 수 있습니다.

select sign(count(1)) cnt 
from my_table 
where hour = " + hour + " and zone = '" + zone+ "' 
    and date = TO_DATE('" + mydate + "','DD-MM-YY'))" 
2

나는 그 결과 만 행의 존재에 대해 신경 이후 0 또는 1이 될 것이다

SELECT COUNT(*) AS cnt 
    FROM mytable m 
WHERE m.hour = hour 
    AND m.zone = zone 
    AND m.date = TO_DATE(mydate,'DD-MM-YY')) 
    AND ROWNUM = 1 

같은 것을 제안의 ROWNUM = 1은 빨리 쿼리가 종료하게됩니다 일치하는 항목을 찾고 전체 표를 스캔하지 못하도록합니다.

관련 문제