用于填充新列的SQL Script条件

时间:2017-10-26 10:16:36

标签: sql sql-server

我在SQL Server数据库上有以下表格:

C093 (称为员工) C093_COD(pk), C093_TYPE 值:0(已注册)或1(实习生), FPC026_COD(fk) ...

FPC026 (称为辛迪加) FPC026_COD(pk) ...

FPC001 (称为机构) FPC001_COD(pk), FPC026_COD(fk) ...

工作原理:员工可以是实习生或注册人。每个学院都有一个相关的辛迪加。 C093上的FPC026_COD(fk)是一个全新的专栏。员工学院的辛迪加必须在这个新的列上,除非这个新字段已经填写(保持相同的值)或者员工是实习生(必须设置为空)。

例如:John是Apple研究所的员工。该研究所有一个名为Apple Syndicate的联合集团。我想通过员工桌上的这一新专栏将John与Apple Syndicate联系起来。如果约翰是实习生,那么它应该是空的。如果John已与Apple Syndycate关联,则此新字段应保持不变。

我试过这样的事情:

UPDATE C093
SET FPC026_COD =
  CASE 
    WHEN FPC026_COD IS NOT NULL THEN FPC026_COD
    WHEN C093_TYPE = 1 THEN NULL
    WHEN C093_TYPE = 0 THEN FPC001.FPC026_COD
  END;
COMMIT;

但我不知道如何获得FPC001.FPC026_COD

3 个答案:

答案 0 :(得分:1)

您可能会发现使用子查询实现这一点最简单:

UPDATE C093
    SET FPC026_COD = (CASE WHEN FPC026_COD IS NOT NULL
                           THEN FPC026_COD
                           WHEN C093_TYPE = 1
                           THEN NULL
                           WHEN C093_TYPE = 0
                           THEN (SELECT FPC001.FPC026_COD FROM FPC001 WHERE FPC001.?? = C093.??)
                      END);
COMMIT;

顺便说一句,CASE中的前两个条件可以合并:

UPDATE C093
    SET FPC026_COD = (CASE WHEN FPC026_COD IS NOT NULL OR C093_TYPE = 1
                           THEN FPC026_COD
                           WHEN C093_TYPE = 0
                           THEN (SELECT FPC001.FPC026_COD FROM FPC001 WHERE FPC001.?? = C093.??)
                      END);

??是因为JOIN键不清楚。使用相应的JOIN键。

您也可以使用JOIN执行此操作,但它必须是外部联接:

UPDATE C093
    SET FPC026_COD = (CASE WHEN FPC026_COD IS NOT NULL OR C093_TYPE = 1
                           THEN FPC026_COD
                           WHEN C093_TYPE = 0
                           THEN FPC001.FPC026_COD 
                      END)
    FROM C093 LEFT JOIN
         FPC001 
         ON FPC001.?? = C093.??;

答案 1 :(得分:0)

您必须加入两个表格。 有点喜欢这个。

UPDATE Table_a
SET Table_a.FPC026_COD=Table_b.Col1
FROM (
SELECT CASE 
WHEN C093 .FPC026_COD IS NOT NULL THEN C093 .FPC026_COD
WHEN C093 .C093_TYPE = 1 THEN NULL
WHEN C093 .C093_TYPE = 0 THEN FPC001.FPC026_COD
END AS Col1
FROM C093
LEFT JOIN FPC001 ON ... (I don't know which key you use for relation 2 tables)) AS Table_b
WHERE Table_a.C093_COD=Table_b.C093_COD

答案 2 :(得分:0)

您可以使用像

这样的更新连接语法
UPDATE a
SET FPC026_COD =
  CASE 
    WHEN FPC026_COD IS NOT NULL THEN FPC026_COD
    WHEN C093_TYPE = 1 THEN NULL
    WHEN C093_TYPE = 0 THEN b.FPC026_COD
  END
FROM C093 a
JOIN FPC001 b
    ON a.FPC026_COD = b.FPC026_COD;