我有以下代码:
WITH CTE_List AS
(
SELECT B.Chain_Code, B.State
FROM Company.dbo.Company_Master AS A
LEFT JOIN Company.dbo.StateChain_List AS B
ON A.State = B.State
AND A.Chain_Code = B.Chain_Code
)
UPDATE Company.dbo.Company_Master
SET MFN_Ind = (
CASE
WHEN (CTE_List.Chain_Code IS NULL) AND (CTE_List.State IS NULL) THEN 'N'
ELSE 'Y'
END
)
FROM CTE_List
CTE_List中的select语句返回如下值,但对应于Company_Master表中的每个记录:
Chain_Code | State
00992 | IL
NULL | NULL
NULL | NULL
00732 | MA
NULL | NULL
我的最终目标是基于这个MFN_Ind更新Company.dbo.Company_Master中的CTE_List列。如果填充了Chain_Code和State,那么MFN_Ind = 'Y‘。如果Chain_Code和State为NULL,则MFN_Ind = 'N‘。
正如现在设置的那样,查询更新MFN_Ind列,将所有设置为'Y‘的内容都更新了,因此很明显,大小写的第一部分没有捕获空字段。有什么我能解决的窍门吗?
谢谢!
发布于 2014-02-05 22:08:23
我觉得你让这件事变得比需要的复杂多了。
UPDATE m
SET m.MFN_Ind = CASE WHEN l.State IS NULL THEN 'N' ELSE 'Y' END
FROM Company.dbo.Company_Master AS m
LEFT OUTER JOIN Company.dbo.StateChain_List AS l
ON m.State = l.State
AND m.Chain_Code = l.Chain_Code;
或者最好将其拆分为2-将所有行更新为N
,然后将匹配的行更新为Y
。
UPDATE Company.dbo.Company_Master SET m.MFN_Ind = 'N';
UPDATE m SET m.MFN_Ind = 'Y'
FROM Company.dbo.Company_Master AS m
WHERE EXISTS (SELECT 1 FROM Company.dbo.StateChain_List AS l
WHERE m.State = l.State
AND m.Chain_Code = l.Chain_Code);
发布于 2014-02-05 22:01:35
WITH CTE_List AS
(
SELECT B.Chain_Code, B.State
FROM Company.dbo.Company_Master AS A
LEFT OUTER JOIN Company.dbo.StateChain_List AS B
ON A.State = B.State
AND A.Chain_Code = B.Chain_Code
)
---UPDATE THE RECORD
UPDATE m
SET MFN_Ind = (
CASE WHEN (CTE.Chain_Code IS NULL) AND (CTE.State IS NULL) THEN 'N'
ELSE 'Y'
END
)
FROM CTE_List cte
INNER JOIN Company.dbo.Company_Master m
on m.State =cte.state
https://stackoverflow.com/questions/21589188
复制相似问题