다음 상관 부속 쿼리가 널이 아님 검사가 결합으로 대체 될 수 있습니까?

Espinosa

하위 쿼리가 따르는이 상관 하위 쿼리가 외래 키에 대한 널 검사가 아닌 경우 조인으로 대체 할 수 있습니까? 예:

select * from TableABC as t
where 
(t.label_id is null or t.label_id in ( select t1.id from Labels as t1 where t1.type = '123'))
and
(t.tag_id is null or t.tag_id in ( select t2.id from Tags as t2 where t2.type = '123'))

단어로 설명 : 레이블 참조가 정의 된 경우 레이블이 특정 유형이어야하는 모든 레코드를 찾고 있다고 가정 해 보겠습니다 . 태그 에도 동일하게 적용됩니다 .

아니면이 쿼리를 다른 방법으로 개선 할 수 있습니까?

TSQL (MS SQL) 용입니다.

업데이트 :
HABO가 암시 한대로 테이블 별칭을 추가했습니다. 가독성이 향상되기를 바랍니다.

하보

이것이 개선 된 것인지는 잘 모르겠지만 left outer join상관 하위 쿼리 대신 사용 합니다.

-- Sample data.
declare @TableABC as Table( ABCId Int Identity, LabelId Int, TagId Int );
declare @Labels as Table( LabelId Int Identity, Label VarChar(3) );
declare @Tags as Table( TagId Int Identity, Tag VarChar(3) );

insert into @Labels ( Label ) values ( '123' ), ( '12' ), ( '123' );
insert into @Tags ( Tag ) values ( '123' ), ( '213' ), ( '123' ), ( '312' );
insert into @TableABC ( LabelId, TagId ) values
  ( 1, 1 ), ( 1, 2 ), ( 1, 3 ), ( 1, 4 ),
  ( 2, 1 ), ( 2, 2 ), ( 2, 3 ), ( 2, 4 ),
  ( 3, 1 ), ( 3, 2 ), ( 3, 3 ), ( 3, 4 ),
  ( NULL, 1 ), ( NULL, 3 ), ( 1, NULL ), ( 3, NULL ), ( NULL, NULL );

select ABC.ABCId, ABC.LabelId, ABC.TagId,
  L.LabelId as L_LabelId, L.Label as L_Label,
  case when ABC.LabelId is NULL or L.Label = '123' then '<<<' else '' end as 'L_Match',
  T.TagId as T_TagId, T.Tag as T_Tag,
  case when ABC.TagId is NULL or T.Tag = '123' then '<<<' else '' end as 'T_Match'
  from @TableABC as ABC left outer join
    @Labels as L on L.LabelId = ABC.LabelId left outer join
    @Tags as T on T.TagId = ABC.TagId;

-- "Original" query:
select *
  from @TableABC
  where ( LabelId is null or LabelId in ( select LabelId from @Labels where Label = '123' ) ) and
    ( TagId is null or TagId in ( select TagId from @Tags where Tag = '123' ) );

-- Left outer joins:
select ABC.*
  from @TableABC as ABC left outer join
    @Labels as L on L.LabelId = ABC.LabelId and L.Label = '123' left outer join
    @Tags as T on T.TagId = ABC.TagId and T.Tag = '123'
  where ( ABC.LabelId is NULL or L.LabelId is not NULL ) and ( ABC.TagId is NULL or T.TagId is not NULL );

팁 : 항상 조인과 함께 유용한 테이블 별칭을 사용하고 모든 열에 적용하십시오.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

MongoDB-관리자가 루트가 될 수 없습니다. "마스터 아님"

분류에서Dev

C ++ 다중 상속이 Java 인터페이스로 대체 될 가능성이 있습니까?

분류에서Dev

HTML 양식을 검사하면 버튼이 그 일부가 아님을 알 수 있습니다.

분류에서Dev

MySQL 쿼리가 실행되지 않음 : "경고 : mysql_fetch_assoc ()는 매개 변수 1이 리소스가 될 것으로 예상합니다."

분류에서Dev

계속 in_array ()는 매개 변수 2가 배열이 될 것으로 예상합니다. 어떻게 고칠 수 있습니까?

분류에서Dev

봇이 텔레 그램 채널의 관리자가 될 수 있습니까?

분류에서Dev

Autodesk forge 뷰어를 사용할 때 필요에 따라 모델의 다른 부분 (전체가 아님)을로드 할 수 있습니까?

분류에서Dev

경고 : mysql_fetch_array ()는 매개 변수 1이 리소스가 될 것으로 예상합니다. 부울은 47 행에 있습니다.

분류에서Dev

작업 관리자로 앱이 종료 된 후에도 서비스가 계속 실행될 수 있습니까?

분류에서Dev

봄에 요청 속성으로 사용할 수있는 빈 이름 'studentRegistration'에 대한 BindingResult 또는 일반 대상 개체가 예외가 아닙니다.

분류에서Dev

조각 대화 상자가 앱에 충돌합니다. 대체 수정 사항이 있습니까?

분류에서Dev

커널이 시스템 호출을 처리 할 때 휴면 상태가 될 수 있다면 어떻게 실행이 시스템 호출로 돌아 갈까요?

분류에서Dev

자식 매개 변수 집합이 다른 개체에서 상속 될 수 있습니까?

분류에서Dev

aspx에 대한 지시문의 제목 속성이 조건부 상태가되도록 뒤에있는 코드에서 참조 될 수 있습니까?

분류에서Dev

다음 쿼리를 JSON 객체로 어떻게 가져올 수 있습니까?

분류에서Dev

프로세스 자체가 배경이 될 수 있습니까?

분류에서Dev

외래 키 열 데이터 (정수)가 상위 테이블의 텍스트 데이터로 변경되도록 두 테이블을 결합합니다 (상위 테이블의 관련 열이 기본 키가 아님).

분류에서Dev

PHP OOP : 객체 속성의 값이 함수가 될 수 있습니까?

분류에서Dev

PHP OOP : 객체 속성의 값이 함수가 될 수 있습니까?

분류에서Dev

Dispatch Semaphore가 실수로 자체 교착 상태가 될 수 있습니까?

분류에서Dev

요청 속성으로 사용할 수있는 빈 이름에 대한 BindingResult 또는 일반 대상 개체가 없으며 이유를 모르겠습니다.

분류에서Dev

비디오를 업로드하는 동안 내부 서버 오류가 발생합니다. 그러나 이미지 업로드는 정상적으로 작동합니다. 무엇이 문제가 될 수 있습니까?

분류에서Dev

간단한 Java 웹 유효성 검사 요청 속성으로 사용할 수있는 빈 이름 'number'에 대한 BindingResult 또는 일반 대상 개체가 없습니다.

분류에서Dev

오류 : onClick 리스너가 함수가 될 것으로 예상하고 대신 reactjs를 사용하여 유형 객체를 얻었습니다.

분류에서Dev

OOP-이벤트가 추상화의 일부가 될 수 있습니까?

분류에서Dev

현재 터미널 상태 (tmux가 아님)를 새 tmux 세션으로 어떻게 변환 할 수 있습니까?

분류에서Dev

요청 속성으로 사용할 수있는 빈 이름 'watchlist'에 대한 BindingResult 또는 일반 대상 개체가 없습니다.

분류에서Dev

Spring Webflow IllegalStateException : 요청 속성으로 사용할 수있는 빈 이름에 대한 BindingResult 또는 일반 대상 개체가 없습니다.

분류에서Dev

java.lang.IllegalStateException : 요청 속성으로 사용할 수있는 빈 이름 'LoginPage'에 대한 BindingResult 또는 일반 대상 개체가 없습니다.

Related 관련 기사

  1. 1

    MongoDB-관리자가 루트가 될 수 없습니다. "마스터 아님"

  2. 2

    C ++ 다중 상속이 Java 인터페이스로 대체 될 가능성이 있습니까?

  3. 3

    HTML 양식을 검사하면 버튼이 그 일부가 아님을 알 수 있습니다.

  4. 4

    MySQL 쿼리가 실행되지 않음 : "경고 : mysql_fetch_assoc ()는 매개 변수 1이 리소스가 될 것으로 예상합니다."

  5. 5

    계속 in_array ()는 매개 변수 2가 배열이 될 것으로 예상합니다. 어떻게 고칠 수 있습니까?

  6. 6

    봇이 텔레 그램 채널의 관리자가 될 수 있습니까?

  7. 7

    Autodesk forge 뷰어를 사용할 때 필요에 따라 모델의 다른 부분 (전체가 아님)을로드 할 수 있습니까?

  8. 8

    경고 : mysql_fetch_array ()는 매개 변수 1이 리소스가 될 것으로 예상합니다. 부울은 47 행에 있습니다.

  9. 9

    작업 관리자로 앱이 종료 된 후에도 서비스가 계속 실행될 수 있습니까?

  10. 10

    봄에 요청 속성으로 사용할 수있는 빈 이름 'studentRegistration'에 대한 BindingResult 또는 일반 대상 개체가 예외가 아닙니다.

  11. 11

    조각 대화 상자가 앱에 충돌합니다. 대체 수정 사항이 있습니까?

  12. 12

    커널이 시스템 호출을 처리 할 때 휴면 상태가 될 수 있다면 어떻게 실행이 시스템 호출로 돌아 갈까요?

  13. 13

    자식 매개 변수 집합이 다른 개체에서 상속 될 수 있습니까?

  14. 14

    aspx에 대한 지시문의 제목 속성이 조건부 상태가되도록 뒤에있는 코드에서 참조 될 수 있습니까?

  15. 15

    다음 쿼리를 JSON 객체로 어떻게 가져올 수 있습니까?

  16. 16

    프로세스 자체가 배경이 될 수 있습니까?

  17. 17

    외래 키 열 데이터 (정수)가 상위 테이블의 텍스트 데이터로 변경되도록 두 테이블을 결합합니다 (상위 테이블의 관련 열이 기본 키가 아님).

  18. 18

    PHP OOP : 객체 속성의 값이 함수가 될 수 있습니까?

  19. 19

    PHP OOP : 객체 속성의 값이 함수가 될 수 있습니까?

  20. 20

    Dispatch Semaphore가 실수로 자체 교착 상태가 될 수 있습니까?

  21. 21

    요청 속성으로 사용할 수있는 빈 이름에 대한 BindingResult 또는 일반 대상 개체가 없으며 이유를 모르겠습니다.

  22. 22

    비디오를 업로드하는 동안 내부 서버 오류가 발생합니다. 그러나 이미지 업로드는 정상적으로 작동합니다. 무엇이 문제가 될 수 있습니까?

  23. 23

    간단한 Java 웹 유효성 검사 요청 속성으로 사용할 수있는 빈 이름 'number'에 대한 BindingResult 또는 일반 대상 개체가 없습니다.

  24. 24

    오류 : onClick 리스너가 함수가 될 것으로 예상하고 대신 reactjs를 사용하여 유형 객체를 얻었습니다.

  25. 25

    OOP-이벤트가 추상화의 일부가 될 수 있습니까?

  26. 26

    현재 터미널 상태 (tmux가 아님)를 새 tmux 세션으로 어떻게 변환 할 수 있습니까?

  27. 27

    요청 속성으로 사용할 수있는 빈 이름 'watchlist'에 대한 BindingResult 또는 일반 대상 개체가 없습니다.

  28. 28

    Spring Webflow IllegalStateException : 요청 속성으로 사용할 수있는 빈 이름에 대한 BindingResult 또는 일반 대상 개체가 없습니다.

  29. 29

    java.lang.IllegalStateException : 요청 속성으로 사용할 수있는 빈 이름 'LoginPage'에 대한 BindingResult 또는 일반 대상 개체가 없습니다.

뜨겁다태그

보관