2013-10-21 50 views
1

我有了2列的表,我試圖更新基於這些標準的另一個表:更新查詢與條件在SQL

  1. 設置標誌,以「好」在最重複鍵對於同一GROUP_KEY Main_Key列(請注意,我們可以有任何GROUP_KEY不同Main_Keys)
  2. 設置標誌,以「壞」在Main_Key列中至少重複鍵爲同一GROUP_KEY
  3. 設置標誌,以「唐」 t使用'如果不同的Main_Keys對於相同的GROUP_KEY是相等的

這裏是我的表

GROUP_KEY MAIN_KEY 
22   4 
22   4 
22   55 
22   55 
22   55 
22   55 
10   10 
10   10 
18   87 
18   22 
18   22 

這裏是預期結果的UPDATE

GROUP_KEY MAIN_KEY   FLAG 
    22   4   Bad 
    22   4   bad 
    22   55   Good 
    22   55   Good 
    22   55   Good 
    22   55   Good 
    10   10   Don't Use 
    10   10   Don't Use 
    18   87   Bad 
    18   22   Good 
    18   22   Good 

後,我只知道怎麼做只是正常的更新查詢,但沒有,甚至開始這個邏輯。日Thnx的幫助

+0

爲什麼18- 87不好? –

+0

感謝您的詢問,因爲我只考慮在Main_Key中對於同一Group_Key具有最多重複編號時的良好。如果你看它,數字22顯示兩次,和87顯示只有一次相同的組密鑰。 – moe

回答

2

用途:

declare @t table(GROUP_KEY int, MAIN_KEY int) 

insert @t values 
(22, 4), 
(22, 4), 
(22, 55), 
(22, 55), 
(22, 55), 
(22, 55), 
(10, 10), 
(10, 10), 
(18, 87), 
(18, 22), 
(18, 22) 

select t.*, b.flag 
from @t t 
join 
(
    select a.GROUP_KEY, a.MAIN_KEY 
     , 
      case 
       when a.GROUP_KEY = a.MAIN_KEY 
        then 'Don''t Use' 
       when a.count = MAX(a.count) over(partition by a.GROUP_KEY) 
        then 'Good' 
       else 'Bad' 
      end [flag] 
    from 
    (
     select t.GROUP_KEY, t.MAIN_KEY, COUNT(*) [count] 
     from @t t 
     group by t.GROUP_KEY, t.MAIN_KEY 
    )a 
)b 
on b.GROUP_KEY = t.GROUP_KEY and b.MAIN_KEY = t.MAIN_KEY 

輸出:

GROUP_KEY MAIN_KEY flag 
----------- ----------- --------- 
10   10   Don't Use 
10   10   Don't Use 
18   22   Good 
18   22   Good 
18   87   Bad 
22   4   Bad 
22   4   Bad 
22   55   Good 
22   55   Good 
22   55   Good 
22   55   Good 

更新: 假設你有你的表flag列:

update @t 
set flag = b.flag 
from @t t 
join 
(
    select a.GROUP_KEY, a.MAIN_KEY 
     , 
      case 
       when a.GROUP_KEY = a.MAIN_KEY 
        then 'Don''t Use' 
       when a.count = MAX(a.count) over(partition by a.GROUP_KEY) 
        then 'Good' 
       else 'Bad' 
      end [flag] 
    from 
    (
     select t.GROUP_KEY, t.MAIN_KEY, COUNT(*) [count] 
     from @t t 
     group by t.GROUP_KEY, t.MAIN_KEY 
    )a 
)b 
on b.GROUP_KEY = t.GROUP_KEY and b.MAIN_KEY = t.MAIN_KEY 
+0

感謝這真的很有幫助,是否有可能將此更改爲更新查詢?我試圖理解你插入和聲明的語法,因爲我已經有了表並且想更新它。 thnx – moe

+0

它正在失敗@t,所以這就是爲什麼我試圖簡化使用更新查詢,因爲我已經有了標誌列表。 thnx – moe

+0

@moe,我已經更新了我的答案。而不是'@ t'使用你的表名。 –