반응형
  1. /**********************************************************************************************
    -- Title : [2k] OUTER JOIN의 T-SQL과 ANSI SQL의 차이
    -- Reference : dBRang.com
    -- Key word : outer join
    **********************************************************************************************/
    /*
    두 쿼리는 일반적으로 outer join 시 발생하는 문제점을 보여 주고 있다. 원래 원하는 것은 쿼리 2의
    결과지만 1같이 tsql 을 사용하여 *= 쿼리를 사용했을 때 문제가 발생할 수 있다.
    *= 조인문의 오른쪽 테이블을 다시 fiter 하게 되면 원하지 않은 데이터가 나올 수 있다.
    원하는 순서는 조인 후에 필터링 하는 거지만 여기서는 우선 필터링을 하여 b.name is null  인건에
    대해서 집합을 생성한 후 이것과 다시 TEST 테이블간에 outer join을 수행하기 때문에 전체 TEST
    테이블 네건에 대한 데이터와 NULL 값들이 들어오게 된다.  이 문제를 해결하려면 쿼리 2와 같이 ANSI
    JOIN 문을 이용하여 조인 후에 필터링 작업을 수행하게 하면 된다.
    */

    USE Tempdb
    GO

    DROP TABLE TEST
    DROP TABLE TEXTB
    GO

    CREATE TABLE TEST(ID INT , name CHAR(4))
    CREATE TABLE TESTB(BID INT , name CHAR(4))
    GO

    INSERT INTO test VALUES(1,'aaaa')
    INSERT INTO test VALUES(2,'bbbb')
    INSERT INTO test VALUES(3,'cccc')
    INSERT INTO test VALUES(4,'dddd')
    INSERT INTO testb VALUES(1,'xxxx')
    INSERT INTO testb VALUES(2,'yyyy')
    INSERT INTO testb VALUES(3,'zzzz')
    GO

    SELECT * FROM test
    SELECT * FROM testb
    GO
     
    -- 아래 두 쿼리 비교
  2. SELECT a.id,a.name, b.bid, b.name
  3. FROM TEST a
  4. left outer join testb b
  5. on a.id = b.bid
  6. where id = 4

  7. SELECT a.id,a.name, b.bid, b.name
  8. FROM TEST a
  9. left outer join testb b
  10. on a.id = b.bid
  11. and a.id = 4


반응형

+ Recent posts