[爆卦]sql查詢兩個資料表是什麼?優點缺點精華區懶人包

雖然這篇sql查詢兩個資料表鄉民發文沒有被收入到精華區:在sql查詢兩個資料表這個話題中,我們另外找到其它相關的精選爆讚文章

在 sql查詢兩個資料表產品中有1篇Facebook貼文,粉絲數超過1萬的網紅91 敏捷開發之路,也在其Facebook貼文中提到, NOT IN/NOT EXISTS/EXCEPT 使用注意事項 #SQL 【SQL Tips】之【 NULL處理技巧,使用NOT IN /NOT EXISTS/EXCEPT】 許多時候,兩個資料表要找出差異值的時候,許多人第一直覺就是使用【NOT IN】,當然大部分時候都不...

  • sql查詢兩個資料表 在 91 敏捷開發之路 Facebook 的最佳貼文

    2016-10-17 08:39:47
    有 34 人按讚


    NOT IN/NOT EXISTS/EXCEPT 使用注意事項

    #SQL

    【SQL Tips】之【 NULL處理技巧,使用NOT IN /NOT EXISTS/EXCEPT】





    許多時候,兩個資料表要找出差異值的時候,許多人第一直覺就是使用【NOT IN】,當然大部分時候都不會有狀況,但是碰到NOT IN的子查詢資料值,如果有NULL,就全盤皆輸,意思就是找不出任何差異。這樣在小量資料可以藉由眼力觀察的狀況下,還可以找出這樣寫法NOT IN的危險地方,但是碰到背景程式,或是資料量多的時候,幾乎無法觀察到這樣危險。所以,告訴自己不要再用【NOT IN】去找出兩邊資料差異。
    反倒是要使用【NOT EXISTS】寫法,雖然是複雜一點,但是跨越SQL Server與Oracle兩種資料庫,都是可以正常找出兩邊資料差異值,不擔心NOT EXISTS的基礎資料表有NULL值狀況。另外值得一提就是,需多人會直接使用SQL Server的【EXCEPT】與Oracle的【MINUS】方式,要留意再留意,這樣的方式雖然可以找出差異值,但是針對回傳值,會自動進行重複資料列移除。
    【SQL Server Code】
    if object_id('x') is not null
    drop table x
    go
    --建立比對基礎資料
    create table x(a int)
    go
    insert into x values(1)
    insert into x values(1) --注意重複
    insert into x values(NULL) --注意NULL
    go

    if object_id('y') is not null
    drop table y
    go

    --建立簡單比對來源資料
    create table y(b int not null)
    go

    insert into y values(1)
    insert into y values(1)
    insert into y values(2)
    insert into y values(2)
    insert into y values(2) --注意三個2

    go

    --三種找出y資料表中(1,1,2,2,2) 然後不存在於 x資料表中的(1,1,null)
    --【預期要回傳三個2】
    --第一種 使用NOT IN 注意(子查詢有NULL值)
    --無法處理對比資料表有NULL狀況
    SELECT b
    FROM y
    WHERE b NOT IN(SELECT a from x)
    GO

    --第二種 使用NOT EXISTS 注意(SELECT 需要 JOIN)
    --忠實回傳三個2
    SELECT b
    FROM y
    WHERE NOT EXISTS (SELECT * FROM x WHERE x.a = y.b)
    GO

    --第三種 使用EXCEPT (僅回傳一個2)
    SELECT b FROM y
    EXCEPT
    SELECT a FROM x
    GO

    【Oracle Code】
    drop table x purge;

    --建立比對基礎資料
    create table x(a int);

    insert into x values(1);
    insert into x values(1); --注意重複
    insert into x values(NULL); --注意NULL

    drop table y purge;

    --建立簡單比對來源資料
    create table y(b int not null);

    insert into y values(1);
    insert into y values(1);
    insert into y values(2);
    insert into y values(2);
    insert into y values(2); --注意三個2

    --三種找出y資料表中(1,1,2,2,2) 然後不存在於 x資料表中的(1,1,null)
    --第一種 使用NOT IN 注意(子查詢有NULL值)
    --無法處理對比資料表有NULL狀況
    SELECT b
    FROM y
    WHERE b NOT IN(SELECT a from x);
    --第二種 使用NOT EXISTS 注意(SELECT 需要 JOIN)
    --忠實回傳三個2
    SELECT b
    FROM y
    WHERE NOT EXISTS (SELECT * FROM x WHERE x.a = y.b);
    --第三種 使用EXCEPT (僅回傳一個2)
    SELECT b FROM y
    MINUS
    SELECT a FROM x;

你可能也想看看

搜尋相關網站