where子句中的连接的情况说明

问题描述 投票:0回答:1

我正在尝试在CASE子句中使用WHERE语句来联接2个表。我想评估POSITION_NBR2,如果它为空(空),那么我想加入A.POSITION_NBR2 = B.POSITION_NBR否则我想加入A.POSITION_NBR = B.POSITION_NBR,但是在尝试运行以下命令时出现语法错误:

UPDATE #WORKTABLE
SET SLT_MEMBER = B.NAME
FROM PS_GHS_FTE_SLT A,
     PS_EMPLOYEES B,
     #WORKTABLE C
WHERE 
  CASE WHEN A.POSITION_NBR2  <> '' THEN A.POSITION_NBR2 = B.POSITION_NBR
       ELSE A.POSITION_NBR = B.POSITION_NBR
       END
  AND A.DEPTID COLLATE Latin1_General_BIN = C.DEPTID COLLATE Latin1_General_BIN
  AND B.EMPL_STATUS = 'A'
sql sql-server-2014
1个回答
2
投票

使用适当的JOIN语法和合理的表别名:

UPDATE WT
    SET SLT_MEMBER = E.NAME
FROM PS_GHS_FTE_SLT GFS JOIN
     PS_EMPLOYEES E
     ON E.POSITION_NBR = (CASE WHEN GFS.POSITION_NBR2 <> '' THEN GFS.POSITION_NBR2 ELSE GFS.POSITION_NBR
                          END) JOIN
     #WORKTABLE WT
     ON GFS.DEPTID COLLATE Latin1_General_BIN = WT.DEPTID COLLATE Latin1_General_BIN 
WHERE E.EMPL_STATUS = 'A';

我通常不喜欢对CASEON子句使用WHERE。不过,在这种情况下,它只是有选择地选择一列,因此不会对我造成太大的困扰。


0
投票

使用适当的JOIN语法和合理的表别名:

UPDATE WT
    SET SLT_MEMBER = E.NAME
FROM PS_GHS_FTE_SLT GFS JOIN
     PS_EMPLOYEES E
     ON E.POSITION_NBR = (CASE WHEN GFS.POSITION_NBR2 <> '' THEN GFS.POSITION_NBR2 ELSE GFS.POSITION_NBR
                          END) JOIN
     #WORKTABLE WT
     ON GFS.DEPTID COLLATE Latin1_General_BIN = WT.DEPTID COLLATE Latin1_General_BIN 
WHERE E.EMPL_STATUS = 'A';

我通常不喜欢对CASEON子句使用WHERE。不过,在这种情况下,它只是有选择地选择一列,因此不会对我造成太大的困扰。

© www.soinside.com 2019 - 2024. All rights reserved.