2012-08-30 83 views
4

我正在努力與SQL語句。SQL更新表中的所有行,除了一些行,複合主鍵

我想更新所有的行,除了一些,在一個複合主鍵表。

這就是我現在做的事:

UPDATE Products SET Active = 0 

_

UPDATE Products SET Active = 1 
WHERE (Id_A = 1 AND Id_B = 1 AND Id_C = 1) OR 
     (Id_A = 1 AND Id_B = 2 AND Id_C = 1) OR 
     (Id_A = 5 AND Id_B = 8 AND Id_C = 3) OR 
     . 
     . 
     . 
     etc 

這工作,但我不喜歡它。我希望能夠一氣呵成。

有沒有辦法在SQL中做到這一點?

+0

爲什麼不把不應該更新的行呢?什麼是例外? –

+3

什麼是數據庫系統,哪個版本? * SQL *只是*結構化查詢語言* - 許多數據庫系統使用的語言,但不是數據庫產品......它真的有助於瞭解您正在使用的數據庫系統**。 –

回答

7

你的意思是這樣的:

UPDATE Products SET Active = CASE WHEN 
     (Id_A = 1 AND Id_B = 1 AND Id_C = 1) OR 
     (Id_A = 1 AND Id_B = 2 AND Id_C = 1) OR 
     (Id_A = 5 AND Id_B = 8 AND Id_C = 3) OR 
     . 
     . 
     . 
     THEN 1 ELSE 0 END 
+0

我想他想減少限制的數量,而不是把它們放在別處。 –

+0

啊我以爲他想在一個更新的基礎上 –

+0

0/1沒有,這是正確的!這是我想要的。謝謝! –

1

你可以使用一個更新語句內的情況下,體現在哪裏?

喜歡的東西

UPDATE Products 
    set Active = CASE WHEN (Id_A = 1 AND Id_B = 1 AND Id_C = 1) THEN 1 
         WHEN (Id_A = 1 AND Id_B = 2 AND Id_C = 1) THEN 1       
         . 
         . 
         . 
         ELSE 0 END 
2

在某些SQL產品,可以進一步簡化語法內CASE,清除多個ANDOR一個簡單IN

UPDATE Products 
SET Active = CASE WHEN 
     (Id_A, Id_B, Id_C) IN 
     ((1, 1, 5), (1, 2, 1), (5, 8, 3) ...) 
      THEN 1 ELSE 0 
      END ; 

另一件事要考慮的是如果表格有很多行(如數百萬或數十億)並且只有很小的百分比被設置爲Active=1,它可能會更有效地已更新所做的是2個陳述,類似於你從一開始有什麼,假設你有(Active)索引(或(Active=1)部分索引):

UPDATE Products SET Active = 0 WHERE Active = 1 ; 

UPDATE Products SET Active = 1 WHERE ... ; 
+0

不幸的是,我的mssql不喜歡這個。我喜歡它的清潔 –

+0

不,這在SQL-Server中不起作用。 –

相關問題