복붙노트

[SQL] 가입 대 존재하고 사용의 절 존재

SQL

가입 대 존재하고 사용의 절 존재

다음 코드 샘플은 다음과 같습니다

CREATE TABLE #titles(
    title_id       varchar(20),
    title          varchar(80)       NOT NULL,
    type           char(12)          NOT NULL,
    pub_id         char(4)               NULL,
    price          money                 NULL,
    advance        money                 NULL,
    royalty        int                   NULL,
    ytd_sales      int                   NULL,
    notes          varchar(200)          NULL,
    pubdate        datetime          NOT NULL
 )
 GO

 insert #titles values ('1', 'Secrets',   'popular_comp', '1389', $20.00, $8000.00, 10, 4095,'Note 1','06/12/94')
 insert #titles values ('2', 'The',       'business',     '1389', $19.99, $5000.00, 10, 4095,'Note 2','06/12/91')
 insert #titles values ('3', 'Emotional', 'psychology',   '0736', $7.99,  $4000.00, 10, 3336,'Note 3','06/12/91')
 insert #titles values ('4', 'Prolonged', 'psychology',   '0736', $19.99, $2000.00, 10, 4072,'Note 4','06/12/91')
 insert #titles values ('5', 'With',      'business',     '1389', $11.95, $5000.00, 10, 3876,'Note 5','06/09/91')
 insert #titles values ('6', 'Valley',    'mod_cook',     '0877', $19.99, $0.00,    12, 2032,'Note 6','06/09/91')
 insert #titles values ('7', 'Any?',      'trad_cook',    '0877', $14.99, $8000.00, 10, 4095,'Note 7','06/12/91')
 insert #titles values ('8', 'Fifty',     'trad_cook',    '0877', $11.95, $4000.00, 14, 1509,'Note 8','06/12/91')
 GO


CREATE TABLE #sales(
    stor_id        char(4)           NOT NULL,
    ord_num        varchar(20)       NOT NULL,
    ord_date       datetime          NOT NULL,
    qty            smallint          NOT NULL,
    payterms       varchar(12)       NOT NULL,
    title_id       varchar(80)
)
 GO
insert #sales values('1', 'QA7442.3', '09/13/94', 75, 'ON Billing','1')
insert #sales values('2', 'D4482',    '09/14/94', 10, 'Net 60',    '1')
insert #sales values('3', 'N914008',  '09/14/94', 20, 'Net 30',    '2')
insert #sales values('4', 'N914014',  '09/14/94', 25, 'Net 30',    '3')
insert #sales values('5', '423LL922', '09/14/94', 15, 'ON Billing','3')
insert #sales values('6', '423LL930', '09/14/94', 10, 'ON Billing','2')


SELECT    title, price
FROM      #titles
WHERE     EXISTS
(SELECT   *
FROM      #sales
WHERE     #sales.title_id = #titles.title_id
AND       qty >30)


SELECT    t.title, t.price
FROM     #titles t
inner join #sales s on t.title_id = s.title_id
where s.qty >30 

저도 같은 result.Also 키워드 EXISTS의 목적을 정확하게 사용하는 방법에 대해 알고 싶어 제공이 쿼리 위의 차이는 무엇인가 알고 싶어?

해결법

  1. ==============================

    1.부울 값을 반환하는 데 사용됩니다 존재 반환에게 완전히 다른 테이블에 가입하세요

    부울 값을 반환하는 데 사용됩니다 존재 반환에게 완전히 다른 테이블에 가입하세요

    단지 시험에 사용되는 존재하는 하위 쿼리는 곧 않는 한 결과, 짧은 회로를 반환하는 경우. 관계가되는 다른 테이블의 추가 필드를 조합하여 결과 집합을 확장하는 데 조인.

    당신의 예에서 쿼리는 의미 적으로 동일합니다.

    일반적으로 사용하는 경우에 존재합니다

    당신이 적절한 인덱스가있는 경우는 가입을 동일하게 수행 존재하는 대부분의 시간. 그것은 빠르고 사용이 존재에 일반적으로 여기서 예외는 매우 복잡 하위 쿼리에 있습니다.

    당신의 가입 키가 인덱싱되지 않은 경우 사용이 존재하지만 당신이 특정의 상황에 대한 테스트를해야합니다, 그것은 빠르게 할 수있다.

    구문은 일반적으로뿐만 아니라 읽기 쉽고 명확 가입하세요.

  2. ==============================

    2.3 행 5 열의 정합 너무

    3 행 5 열의 정합 너무

    그 결과, 타인에 의해 언급 된 "단락"효과와 함께 조인 DISTINCT를 사용하기위한 요구이다. N 관계 : n 개의 1의 측면에 행의 존재를 찾을 때 EXISTS 거의 항상 빠릅니다.

  3. ==============================

    3.주로 바로 가기로 사용된다 존재한다. 조건이 참으로가 (이 항상 사실이 아니었지만, ()뿐만 아니라이 최적화에있어 발생할 수있는 SQL 서버의 현대 버전) 전체 테이블을 스캔 할 필요가 없습니다 수 있도록 기본적으로 최적화는 즉시 구제됩니다. 이 문제는 쿼리의 쿼리에 따라 다를 수 있으며, 경우에 따라서는 실제로 최적화에게 그 일을 위해 더 많은 기회를 제공 할 수 있습니다 가입 할 수 있습니다. 내가 생각하는 그래서 말을하기 어렵다 "당신이 존재 사용해야 할 때이 때, 그리고이 안이는"많은 것들처럼, 때문에 "가 달려있다."

    주로 바로 가기로 사용된다 존재한다. 조건이 참으로가 (이 항상 사실이 아니었지만, ()뿐만 아니라이 최적화에있어 발생할 수있는 SQL 서버의 현대 버전) 전체 테이블을 스캔 할 필요가 없습니다 수 있도록 기본적으로 최적화는 즉시 구제됩니다. 이 문제는 쿼리의 쿼리에 따라 다를 수 있으며, 경우에 따라서는 실제로 최적화에게 그 일을 위해 더 많은 기회를 제공 할 수 있습니다 가입 할 수 있습니다. 내가 생각하는 그래서 말을하기 어렵다 "당신이 존재 사용해야 할 때이 때, 그리고이 안이는"많은 것들처럼, 때문에 "가 달려있다."

    테이블 간의 1 일치, 당신이 어떤 성능 차이를 볼 가능성이 및 최적화 가능성이 유사하거나 동일한 계획을 생성합니다 : 당신은 본질적으로 하나 갖고 있기 때문에 즉,이 경우 말했다. 당신은 당신이 각 타이틀을 위해 50,000 행을 추가 할 때 판매 테이블에있는 / 가입 비교한다면 당신은 뭔가 다른를 볼 수 있습니다 (만약 당신이 무엇을 중복 집계를 제거하기 위해 가입 쿼리를 변경해야합니다 것을 신경 쓰지 않는다).

  4. ==============================

    4.난 내가에 따라 제외 할 행이있을 때 가장 유용하게 존재 어떻게 상호 작용 다른 행 찾으십시오.

    난 내가에 따라 제외 할 행이있을 때 가장 유용하게 존재 어떻게 상호 작용 다른 행 찾으십시오.

    예를 들어,

    SELECT * 
      FROM TABLE a
     WHERE a.val IN (1,2,3)
       AND NOT EXISTS(SELECT NULL
                        FROM TABLE b
                       WHERE b.id = a.id
                         AND b.val NOT IN (1, 2, 3))
    

    이 경우, 나는 동일한 ID와 B의 기록을 가지고 있지만, 잘못된 것을 기반으로 내 쿼리의 행을 제외하고있다.

    이것은 실제로 내가 직장에서 한 생산 문제에서왔다. 쿼리 2 초 미만까지 24초에서로드 시간을내어, 쿼리에 대신 응용 프로그램에서 제외 로직의 대부분을 이동했다. :-)

  5. from https://stackoverflow.com/questions/7082449/exists-vs-join-and-use-of-exists-clause by cc-by-sa and MIT license