2015-06-03 54 views
-1

我有2個表:在SQL SERVER 「NOT IN」 的替代

  1. 百貨商店表(保存百貨商店的數據):

enter image description here

  • AccDocSales表(由系由令保存數據):
  • enter image description here

    現在,我想選擇這些部門,它不會在每個MONTH的AccDocSales表中顯示(這意味着哪個部門每個MONTH的AccDocSales表中沒有DeptCode)。

    EX(這種情況下):

    enter image description here

    我用這個查詢:此查詢

    SELECT distinct MONTH(DocDate) as THANG, B20Dept.Code, B20Dept.Name 
    FROM B20Dept, B30AccDocSales S1 
    WHERE YEAR(S1.DocDate) = 2014 AND B20Dept.Code NOT IN 
    (
        SELECT S2.DeptCode 
        FROM B30AccDocSales S2, B20Dept 
        WHERE YEAR(S2.DocDate) = 2014 AND S2.DeptCode = B20Dept.Code 
        AND MONTH(S1.DocDate) = MONTH(S2.DocDate) 
    ) 
    ORDER BY MONTH(DocDate) 
    

    它的工作,但我的老師說: 「NOT IN」 是不是可以接受的。他問我找到另一種方法來做到這一點,沒有「IN」,「NOT IN」。

    PS:我發現這個查詢還有一個問題。這是哪個月在「DeptCode」中的所有部門,哪個月沒有行,它們在運行該查詢時都不會顯示任何結果。

    請幫忙。

    +0

    簡單'JOIN'可以做。 –

    +2

    嘗試使用「不存在」。 –

    +6

    看到那裏:http://sqlperformance.com/2012/12/t-sql-queries/left-anti-semi-join –

    回答

    1

    嘗試這種解決方案:

    select s.*, d.* 
    from B20Dept d 
        cross apply (select distinct YEAR(s.DocDate) Y, MONTH(s.DocDate) THANG from B30AccDocSales s) s 
        left join (
         select YEAR(s.DocDate) Y, MONTH(s.DocDate) THANG, s.DeptCode 
         from B30AccDocSales s 
         group by YEAR(s.DocDate), MONTH(s.DocDate), s.DeptCode) m on m.Y = s.Y and m.THANG = s.THANG and m.DeptCode = d.Code 
    where m.DeptCode is null 
    order by s.Y, s.THANG 
    

    編輯: 在下面的查詢中,你可以找到解決問題的辦法,那就是在你PS:

    declare @Year int = 2014 
    select s.*, d.* 
    from B20Dept d 
        cross apply (values (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12)) s (THANG) 
        left join (
         select MONTH(s.DocDate) THANG, s.DeptCode 
         from B30AccDocSales s 
         where YEAR(s.DocDate) = @Year 
         group by MONTH(s.DocDate), s.DeptCode) m on m.THANG = s.THANG and m.DeptCode = d.Code 
    where m.DeptCode is null 
    union 
    select MONTH(s.DocDate) THANG, '', '' 
    from B30AccDocSales s 
    where YEAR(s.DocDate) = @Year 
    group by MONTH(s.DocDate) 
    having COUNT(distinct s.DeptCode) = (select count(1) from B20Dept) 
    order by s.THANG 
    
    +0

    謝謝。但是在一個月中,完整部門和一個月不會顯示在B30AccDocSales中,兩者都不會顯示在查詢結果中(與我的查詢相同)。 –

    +0

    我編輯我的答案,以滿足您的最後requeriments。 –

    +0

    它工作。非常感謝。 –