Sql 在使用案例的UPDATE语句中使用CTE

Sql 在使用案例的UPDATE语句中使用CTE,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有以下代码: 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

我有以下代码:

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_列表中的select语句返回如下值,但与Company_主表中的每条记录相对应:

Chain_Code | State
00992      | IL
NULL       | NULL
NULL       | NULL
00732      | MA
NULL       | NULL
我的最终目标是根据此CTE_列表更新Company.dbo.Company_Master中的MFN_Ind列。如果已填充链码和状态,则最惠国标识='Y'。如果链码和状态为空,则最惠国标识='N'

现在进行设置时,查询会将MFN_Ind列的所有内容都设置为“Y”,因此很明显,案例的第一部分不会捕获空字段。关于如何解决这个问题有什么建议吗


谢谢大家!

我认为你把事情弄得比实际需要的复杂得多

    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
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);

如果右侧的链码和状态为空,您如何真正连接这些表?链码和状态在StateChain\u列表或Company\u Master中实际上不是空的。我想要的CTE_列表基本上只是公司主数据中所有记录的列表。如果填写了链码和状态,则表示Company_Master中记录的链码和状态与StateChain_列表中的链码和状态之一匹配。当值为空时,这意味着Company_Master中的链代码和状态与StateChain_列表中的任何链代码和状态都不匹配。然后在更新中,我可以根据每个记录是否为空来更新它。这将只更新CTE中状态为非空的行。其他所有内容都将在内部联接上过滤掉。请使用左外部联接而不是内部联接。它应该很好用。