2014-11-24 65 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')) 
相关问题