2014-11-24 66 views
0

我已經做了一些SQL代碼(我想)會更新1字段只有一些記錄。我所做的代碼是:爲什麼此UPDATE更改所有行而不是一行?

UPDATE Name 
SET name.STATUS = 'a' 
WHERE EXISTS 
    (SELECT Name.ID, 
      Name.MEMBER_TYPE, 
      Name.CATEGORY, 
      Name.STATUS, 
      Name.COMPANY_SORT, 
      Name.FULL_NAME, 
      Name.TITLE, 
      Name.FUNCTIONAL_TITLE, 
      Activity.ACTIVITY_TYPE, 
      Activity.PRODUCT_CODE, 
      Activity.TRANSACTION_DATE 
    FROM Name 
    INNER JOIN Activity ON Name.ID = Activity.ID 
    WHERE ACTIVITY_TYPE = 'ELECTIONS' 
     AND PRODUCT_CODE LIKE '%new%' 
     AND TRANSACTION_DATE LIKE '%2014%' 
     AND name.MEMBER_TYPE IN ('mcm', 
           'MCNM')) 

,但它的名稱命名的所有記錄更新爲a狀態,而不僅僅是一個在那裏存在的說法......我有什麼搞砸了?

+1

運行在自己的SELECT語句;這會告訴你哪些行受到影響。這將超出您的預期。請注意,SELECT中的'Name'與UPDATE中的'Name'分開;也就是說,子查詢不是與UPDATE中的行相關的子查詢。 – 2014-11-24 17:37:41

+1

我認爲這是因爲只要有一條記錄被SELECT返回,就會驗證EXISTS條件導致完全更新,因爲沒有其他條件 – Guillaume 2014-11-24 17:38:49

回答

1

嘗試這樣:

UPDATE Name 
SET name.STATUS = 'a' 
WHERE EXISTS 
    (SELECT * 
    FROM Activity 
    WHERE Name.ID = Activity.ID 
     AND ACTIVITY_TYPE = 'ELECTIONS' 
     AND PRODUCT_CODE LIKE '%new%' 
     AND TRANSACTION_DATE LIKE '%2014%' 
     AND name.MEMBER_TYPE IN ('mcm', 'MCNM') 
    ) 

一些解釋:當你在內部查詢做FROM Name你屏蔽外部表Name,只是查詢整個事情。所以每個條目的內部查詢都是一樣的。您需要從外部查詢中重用Name,以便內部查詢與外部查詢相關。對不起,我的代碼可能需要一些提升,我甚至不知道你在使用哪個數據庫。

0

您需要將外部查詢「名稱」表連接到子查詢。注意where標準中的添加。我沒有運行這個,但它應該指向正確的方向。

UPDATE Name 
SET name.STATUS = 'a' 
WHERE EXISTS 
    (SELECT innerName.ID, 
      innerName.MEMBER_TYPE, 
      innerName.CATEGORY, 
      innerName.STATUS, 
      innerName.COMPANY_SORT, 
      innerName.FULL_NAME, 
      innerName.TITLE, 
      innerName.FUNCTIONAL_TITLE, 
      Activity.ACTIVITY_TYPE, 
      Activity.PRODUCT_CODE, 
      Activity.TRANSACTION_DATE 
    FROM Name innerName 
    INNER JOIN Activity ON innerName.ID = Activity.ID 
    WHERE ACTIVITY_TYPE = 'ELECTIONS' 
AND innerName.ID = Name.ID 
     AND PRODUCT_CODE LIKE '%new%' 
     AND TRANSACTION_DATE LIKE '%2014%' 
     AND innerName.MEMBER_TYPE IN ('mcm', 
           'MCNM')) 
+1

您不需要所有那麼長的字段列表,因爲它是'EXISTS'。 – Andrey 2014-11-24 17:41:48

+0

是的,但它仍然有效。我只是複製/粘貼了OP的代碼,並添加了一些符合預期的標準。 – Noel 2014-11-24 17:50:41

0

有UPDATE語句的數據選擇之間沒有聯繫,對您的SUB-SELECT定義什麼(即啓動EXISTS子句後)。基本上,它說要更新所有,如果下面的選擇有任何記錄。

EXISTS子句不夠聰明,不知道你在說什麼記錄。你必須告訴他。

0

問題在於,在更新行中對Name的引用和對子查詢下對Name的引用被視爲兩個單獨的實例,因此update語句和子查詢之間沒有關係。

要解決它,你實際上可以別名子查詢本身內的表,然後明確提及的別名更新:

UPDATE nm 
SET nm.STATUS = 'a' 
WHERE EXISTS 
    (SELECT * 
    FROM Name nm 
    INNER JOIN Activity act ON nm.ID = act.ID 
    WHERE ACTIVITY_TYPE = 'ELECTIONS' 
     AND PRODUCT_CODE LIKE '%new%' 
     AND TRANSACTION_DATE LIKE '%2014%' 
     AND nm.MEMBER_TYPE IN ('mcm', 
           'MCNM')) 
相關問題