"not in"절을 사용하여 상관 하위 쿼리 다시 작성

ptc3

명백한 성능상의 이유로 "not in"절과 관련된 상호 관련된 하위 쿼리를 포함하는 기존 Oracle SQL 쿼리를 다시 작성하고 싶습니다. 이것은 외부 조인 또는 다른 기술을 통해 수행 할 수 있습니까?

다음은 코드입니다.

SELECT TRIM(et.event_id), TRIM(et.cancel_evt_id)
FROM external_transactions et
JOIN transaction_type tt
    ON et.transaction_type_id = tt.transaction_type_id
WHERE et.acct = 'ABCDEF' 
AND tt.transaction_type_class != 'XYZXYZ'
AND 
(
    TRIM(et.event_id) NOT IN
        (
        SELECT TRIM(t1.transaction_evt_id)
        FROM transactions t1
        WHERE t1.acct = et.acct
        AND t1.asset_id = et.asset_id
        AND t1.cancel_flag = 'N' 
        )
    OR TRIM(et.cancel_evt_id) NOT IN
        (
        SELECT TRIM(t2.cancel_evt_id)
        FROM transactions t2
        WHERE t2.acct = et.acct
        AND t2.asset_id = et.asset_id
        AND t2.cancel_flag = 'Y'
        )
)
;
베이지

주석을 제외하고 이것은 "ID"열이 문자열이 아닌 정수 기반이라고 가정하고 변환하지 마십시오.

또한 쿼리를 최적화하는 데 도움이되도록 색인이 있는지 확인하겠습니다.

External_Transactions    ( acct, event_id, cancel_evt_id )
Transaction_Type   ( transaction_type_id, transaction_type_class )
Transactions ( transaction_evt_id, acct, asset_id, cancel_flag )
Transactions ( cancel_evt_id, acct, asset_id, cancel_flag )


SELECT 
      et.event_id, 
      et.cancel_evt_id
   FROM 
      external_transactions et
         JOIN transaction_type tt
            ON et.transaction_type_id = tt.transaction_type_id
           AND tt.transaction_type_class != 'XYZXYZ'
         LEFT OUTER JOIN transactions t1
            ON  et.event_id = t1.transaction_evt_id
            AND et.acct = t1.acct
            AND et.asset_id = t1.asset_id
            AND t1.cancel_flag = 'N'
         LEFT OUTER JOIN transactions t2
            ON  et.cancel_evt_id = t2.cancel_evt_id
            AND et.acct = t2.acct
            AND et.asset_id = t2.asset_id
            AND t2.cancel_flag = 'Y'
   WHERE 
          et.acct = 'ABCDEF' 
      AND (    t1.transaction_evt_id IS NULL
            OR t2.cancel_evt_id IS NULL )

트랜잭션 테이블에 인덱스가 있으면 약간의 이점을 얻을 수 있습니다.

Transactions ( acct, asset_id, cancel_flag, transaction_evt_id, cancel_evt_id )

왼쪽 조인은

SELECT 
      et.event_id, 
      et.cancel_evt_id
   FROM 
      external_transactions et
         JOIN transaction_type tt
            ON et.transaction_type_id = tt.transaction_type_id
           AND tt.transaction_type_class != 'XYZXYZ'
         LEFT OUTER JOIN transactions t1
            ON  et.acct = t1.acct
            AND et.asset_id = t1.asset_id
            AND ( 
                  (   t1.cancel_flag = 'N'
                  AND et.event_id = t1.transaction_evt_id )
                OR
                  (   t1.cancel_flag = 'Y'
                  AND et.cancel_event_id = t1.cancel_evt_id )
                )
   WHERE 
          et.acct = 'ABCDEF' 
      AND t1.transaction_evt_id IS NULL

두 경우 모두 인덱스는 COVERING 인덱스이므로 레코드의 다른 요소를 확인하기 위해 원시 데이터 페이지로 돌아갈 필요가 없습니다.

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

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

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

상관 하위 쿼리를 사용하지 않고이 쿼리를 다시 작성해야합니다.

분류에서Dev

조인을 사용하여 하위 쿼리를 다시 작성하는 방법

분류에서Dev

성능 향상을 위해 where 절없이 쿼리 다시 작성

분류에서Dev

JOIN을 사용하여 다시 작성할 수없는 하위 쿼리를 사용하여 작성된 쿼리의 예?

분류에서Dev

여러 행 상위 쿼리 단일 행 반환을 사용하여 하위 쿼리 하위 쿼리를 작성하는 방법

분류에서Dev

문자열 작성기를 사용하여 WHERE 절을 동적으로 쿼리하고 싶습니다.

분류에서Dev

를 사용하여 두 개의 열을 통해 하위 쿼리 상관 관계

분류에서Dev

여러 열을 통해 상관 하위 쿼리를 사용하여

분류에서Dev

select 절에서 하위 쿼리를 CTE로 다시 작성하는 방법

분류에서Dev

mysql은 in 절을 사용하여 하위 쿼리에 값을 전달합니다.

분류에서Dev

Yii2의 자동 완성 위젯을 사용하여 둘 이상의 테이블을 쿼리합니다.

분류에서Dev

where 절에 상관 된 하위 쿼리가있는 SQL 쿼리

분류에서Dev

중첩 된 AND, OR 및 관련 모델 조건을 사용하여 cakephp 쿼리 작성

분류에서Dev

Django db Api를 사용하여 SQL 쿼리 다시 작성

분류에서Dev

Neo4j Repository-동적 where 절을 사용하여 쿼리 작성

분류에서Dev

웅변 모델에서 조건부 where 절을 사용하여 쿼리 작성

분류에서Dev

Hive에서 다중 하위 쿼리로 SQL을 다시 작성하는 방법

분류에서Dev

하위 디렉터리와 쿼리 문자열을 사용하여 동적 URL을 다시 작성해야합니다.

분류에서Dev

날짜 제한과 관련된 JPA2를 사용하여 EntityManger로 Hibernate SessionFactory 쿼리 다시 작성

분류에서Dev

IN 절없이 SQL 쿼리를 다시 작성하는 방법

분류에서Dev

활성 관리자를 사용하여 일괄 작업을 위해 선택한 열 수 표시

분류에서Dev

SQL Server : WHERE 절에 여러 CTE 및 하위 쿼리가있는 쿼리의 성능을 향상시키는 방법

분류에서Dev

mysql-하위 쿼리로 쿼리 다시 작성

분류에서Dev

기준을 사용하여 하위 쿼리를 작성하는 방법

분류에서Dev

하위 문자열을 사용하여 SQL 쿼리를 작성하는 방법

분류에서Dev

람다 식을 사용하여 다 대다 관계 쿼리

분류에서Dev

URL을 다시 작성하여 쿼리 문자열 숨기기

분류에서Dev

OR 사용을 피하기 위해 ON 절을 다시 작성하는 방법

분류에서Dev

Gorm을 사용하여 다 대다 관계 쿼리

Related 관련 기사

  1. 1

    상관 하위 쿼리를 사용하지 않고이 쿼리를 다시 작성해야합니다.

  2. 2

    조인을 사용하여 하위 쿼리를 다시 작성하는 방법

  3. 3

    성능 향상을 위해 where 절없이 쿼리 다시 작성

  4. 4

    JOIN을 사용하여 다시 작성할 수없는 하위 쿼리를 사용하여 작성된 쿼리의 예?

  5. 5

    여러 행 상위 쿼리 단일 행 반환을 사용하여 하위 쿼리 하위 쿼리를 작성하는 방법

  6. 6

    문자열 작성기를 사용하여 WHERE 절을 동적으로 쿼리하고 싶습니다.

  7. 7

    를 사용하여 두 개의 열을 통해 하위 쿼리 상관 관계

  8. 8

    여러 열을 통해 상관 하위 쿼리를 사용하여

  9. 9

    select 절에서 하위 쿼리를 CTE로 다시 작성하는 방법

  10. 10

    mysql은 in 절을 사용하여 하위 쿼리에 값을 전달합니다.

  11. 11

    Yii2의 자동 완성 위젯을 사용하여 둘 이상의 테이블을 쿼리합니다.

  12. 12

    where 절에 상관 된 하위 쿼리가있는 SQL 쿼리

  13. 13

    중첩 된 AND, OR 및 관련 모델 조건을 사용하여 cakephp 쿼리 작성

  14. 14

    Django db Api를 사용하여 SQL 쿼리 다시 작성

  15. 15

    Neo4j Repository-동적 where 절을 사용하여 쿼리 작성

  16. 16

    웅변 모델에서 조건부 where 절을 사용하여 쿼리 작성

  17. 17

    Hive에서 다중 하위 쿼리로 SQL을 다시 작성하는 방법

  18. 18

    하위 디렉터리와 쿼리 문자열을 사용하여 동적 URL을 다시 작성해야합니다.

  19. 19

    날짜 제한과 관련된 JPA2를 사용하여 EntityManger로 Hibernate SessionFactory 쿼리 다시 작성

  20. 20

    IN 절없이 SQL 쿼리를 다시 작성하는 방법

  21. 21

    활성 관리자를 사용하여 일괄 작업을 위해 선택한 열 수 표시

  22. 22

    SQL Server : WHERE 절에 여러 CTE 및 하위 쿼리가있는 쿼리의 성능을 향상시키는 방법

  23. 23

    mysql-하위 쿼리로 쿼리 다시 작성

  24. 24

    기준을 사용하여 하위 쿼리를 작성하는 방법

  25. 25

    하위 문자열을 사용하여 SQL 쿼리를 작성하는 방법

  26. 26

    람다 식을 사용하여 다 대다 관계 쿼리

  27. 27

    URL을 다시 작성하여 쿼리 문자열 숨기기

  28. 28

    OR 사용을 피하기 위해 ON 절을 다시 작성하는 방법

  29. 29

    Gorm을 사용하여 다 대다 관계 쿼리

뜨겁다태그

보관