为什么这个UPDATE改变所有行而不是只改变一行?

时间:2014-11-24 17:31:11

标签: sql

我已经制作了一些SQL代码(我认为)只会为某些记录更新1字段。我制作的代码是:

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的状态,而不仅仅是where exists语句中的那个...我搞砸了什么?

4 个答案:

答案 0 :(得分: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,以便内部查询与外部查询相关。对不起,我的代码可能需要一些抛光我甚至不知道你正在使用什么数据库。

答案 1 :(得分:0)

您需要将外部查询“Name”表连接到子查询。请注意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'))

答案 2 :(得分:0)

UPDATE语句的数据选择与您在SUB-SELECT中定义的内容(在EXISTS子句之后开始)之间没有任何联系。基本上,它表示要更新所有,如果下面的选择有任何记录。

EXISTS条款不够智能,无法知道您正在谈论的记录。你必须告诉他。

答案 3 :(得分: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'))