2016-08-23 2 views
1

Microsoft SQL Server 2012를 사용합니다. 데이터베이스에 SiteObjects이라는 테이블에 SiteRegionId의 이름이 22 인 열이있는 레코드가 하나 이상 있는지 확인해야합니다.SQL 열에 값이 있는지 확인하는 방법은 무엇입니까?

만약 다른 논리를 구현해야한다면 그것은 어떤 논리를 imlpement해야한다. 여기

내 구현 : 이해로 모든 테이블 행에서 실행 SiteRegionId이 동일한 모든 행을 선택하기 때문에

SELECT * FROM SiteObjects WHERE SiteRegionId = 22 

효과가 없습니다 :

IF EXISTS (SELECT * FROM SiteObjects WHERE SiteRegionId = 22) 
BEGIN 
    ----do what you need if exists 
    RETURN '0'; --not deleted 
END 
ELSE 
BEGIN 
    --do what needs to be done if not 
    DELETE FROM SiteRegions 
    WHERE Id = 22; 

    RETURN '1'; 
END 

내가이 행이라고 생각 22. 더 효과적인 방법이 있습니까? 그리고 행의이 조건을 충족시키는 지 확인하려면 계속 진행하십시오.

답변

3

아니요, EXISTS은 단일 행을 관찰하는 즉시 true를 반환 할만큼 똑똑합니다. 그리고 시스템은 열 데이터가 실제로 검색되지 않는다는 것을 알고 있습니다.

위로 90 년대에 일부 옵티마이 저 및 데이터베이스 시스템은 이러한 상황을 인식 할만큼 현명하지 못했지만 실제로 모든 데이터를 검색하는 요즘은 알지 못합니다. (물론 SQL Server 제품군의 경우 2000 버전 이전에 수정되었습니다.)

따라서 다른 답변의 제안은 10 년 전부터 남긴 조언입니다.

Subqueries with Exists를 참조하십시오

하위 쿼리는 실제로 데이터

을 생성하지 않습니다 ...

  • EXISTS가 소개하는 하위 쿼리의 선택 목록은 거의 항상 별표 (*)로 구성됩니다. 하위 쿼리에 지정된 조건을 충족시키는 행이 있는지 여부 만 테스트하기 때문에 열 이름을 나열 할 이유가 없습니다.
+0

따라서이 사이에 차이점이 2 : 존재하는지 존재하지 않으면 ' 은'(SELECT SiteObjects SiteRegionId = 22 *) ' (SiteRegionId가 = 22 WHERE SiteObjects에서 1을 선택) ?? – Michael

+0

@Michael - 당신이 계획을 비교한다면, 그들이 동일하다는 것을 발견해야합니다. –

1

난 당신이 작성하는 제안 :

IF EXISTS (SELECT 1 FROM SiteObjects WHERE SiteRegionId = 22) 

당신은 * 즉 사용 기록의 존재를 확인하기 위해 테이블의 모든 열을 가져올 필요 없어요. 1을 사용하면됩니다.

효율성과 관련하여 쿼리가 두 개인 경우 *을 사용하는 것이고 1을 사용하는 것이 실행될 때 거의 동일한 실행 계획을 갖습니다. 일반적으로 이 더 좋기를 선호합니다. 입니다. 이 링크를 클릭하면 두 쿼리가 어떻게 동일한 실행 계획을 제공하는지 확인할 수 있습니다. SQL SERVER – SELECT 1 vs SELECT * – An Interesting Observation

+0

가독성에 대해 '1'과 '*'가 어떻게 다른지 알 수 없습니다. 'SELECT 1'또는 'SELECT TOP 1'을 보았을 때, 즉각적인 생각은 "이 사람은 90 년대 SQL을 배웠고 이후로 지식을 업데이트하지 못했습니다 (즉, 존재하지 않았던 문제의 해결 방법이었습니다. 긴 시간) " –

1

그냥 SiteRegionId = 22, 다음 (기본 키 컬럼) 인덱스 컬럼 ID를 교체 SELECT TOP 1 id FROM SiteObjects WHERE SiteRegionId = 22

에 쿼리를 변경 한 행이 있는지 알아야하고,이 당신을 말할 경우 행이있는 경우에는 하나의 행에서 하나의 열만 다시 가져 와서 행합니다.

TOP 1 부분은 1 행을 찾은 후 쿼리를 중지하므로 전체 테이블을 조사 할 필요가 없습니다.

+2

*'EXISTS' *는 1 행을 찾은 후 쿼리를 중지합니다. 'TOP'의 도움이 필요 없습니다. –

+0

감사합니다. Damien, 잘 알고 있습니다. – RussAwesome

관련 문제