我已经制作了一些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语句中的那个...我搞砸了什么?
答案 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'))