2012-04-18 113 views
0

我有一個表像這樣:TSQL一個從2條件選擇行

ORDER_ID CODE1 CODE2 CODE3 STATUS 
1   '001' 'BIGP' NULL 4 
2   '002' 'BIGP' NULL 1 
3   '001' NULL NULL 6 
4   '002' NULL 'L'  1 

和第二表所示:

ADDRESS_ID ORDER_ID TYPE ADD_DATE  CATEGORY 
1   1   'K1' '2010-01-01' 'CLIENT' 
2   1   'D1' '2010-01-02' 'SYSTEM' 
3   2   'D2' '2010-01-02' 'SYSTEM' 
4   2   'D2' '2010-02-01' 'CLIENT' 

我必須做,如果爲有每一個訂單是什麼:

  • 狀態未在(4,6)
  • CODE1 = '002'
  • (碼2 = null並且CODE3 = NULL)或(在( 'BIGA', 'BIGP' 碼2)和CODE3 = NULL)或(碼2 = NULL和CODE3 = 'L')

我必須選擇一個地址類型爲'D2'或'K1'(D2具有較高的優先級,所以如果有兩個地址一個K1和另一個D2我必須選擇D2)。
如果沒有任何類型爲D2或K1的地址,我必須爲該訂單選擇類別爲「客戶」的最舊地址。

這是我創造:

SELECT TOP 1000 o.order_Id 
       , a.Address_Id 
       , a.Zip 
      --, * 
FROM orders o 
address a 
    ON a.order_Id = o.order_Id 
WHERE 
(a.Type='D2' OR a.Type='K1') 
AND o.Status NOT IN (4, 6) 
AND code1='002' 
AND ((code2 IS NULL AND code3 IS NULL) OR (code2 IN ('BIGA', 'BIGP') AND code3 IS NULL) OR (code2 IS NULL AND code3 = 'L')) 

回答

3

你可能會採用CROSS APPLY的任務,因爲它允許使用的TOP 1/ORDER BY報表derived table

SELECT TOP 1000 o.order_Id 
       , a.Address_Id 
       , a.Zip 
      --, * 
FROM orders o 
CROSS APPLY 
(
select TOP 1 
     a.Address_Id, 
     a.Zip 
    from address a 
    WHERE a.order_Id = o.order_Id 
    ORDER BY case a.Type 
       when 'D2' then 1 
       when 'K1' then 2 
       else 3 
      end, 
     a.ADD_DATE 
) a 
WHERE 
o.Status NOT IN (4, 6) 
AND code1='002' 
AND ((code2 IS NULL AND code3 IS NULL) OR (code2 IN ('BIGA', 'BIGP') AND code3 IS NULL) OR (code2 IS NULL AND code3 = 'L')) 

除此之外,你可能會加入以最小的地址類型的派生表每個訂單:

from orders o 
inner join address a 
    ON a.order_Id = o.order_Id 
inner join 
(
    select a.order_id, a.Type, 
     row_number() over (partition by a.order_id 
          order by case a.Type when 'D2' then 1 
                when 'K1' then 2 
                else 3 
             end, 
             a.ADD_DATE) rn 
    from Address a 
    group by a.order_id, a.Type 
) onlyOneAddress 
    on a.order_id = onlyOneAddress.order_id 
and a.type = onlyOneAddress.type 
and onlyOneAddress.rn = 1 
+0

我會嘗試第一個解決方案。感謝這麼快的回覆:)哪一個更好/更快? – Misiu 2012-04-18 12:56:14

+0

嘗試兩種。考慮到訂單數量較少,我首先想到的會更好,而第二個訂單的訂單數量會更多,但我必須對其進行測試。 – 2012-04-18 12:58:34

+0

還有一件事。我需要改變這樣的查詢:它必須選擇第一個地址D2,如果不存在,那麼K1(這部分工作),但如果沒有任何D2或K1,我必須爲每個訂單選擇最舊的地址。我編輯了我的問題。 – Misiu 2012-04-18 13:22:01

0

只是[類型]遞減添加的順序,它會顯示在高優先級

+0

這將我的排序結果,我想要做的就是選擇只有一個地址,每訂購。現在我得到2個或更多的地址,我需要每個訂單隻有一個地址。如果有一個D2類型的選擇它,如果沒有選擇K1。 – Misiu 2012-04-18 12:04:21

+0

只選擇top 1而不是選擇top 1000 – 2012-04-18 12:41:29

+0

select top 1只會給我一個地址,我需要一個我的訂單地址列表。如果我有60個訂單,我需要60個地址列表。希望你明白我的觀點:) – Misiu 2012-04-18 12:54:34