【问题标题】:Combining INSERT and CASE SQL Server Queries结合 INSERT 和 CASE SQL Server 查询
【发布时间】:2022-01-06 19:32:59
【问题描述】:

这里有几个 SQL 查询,我尝试将它们编写为单个查询或两个查询。我尝试了各种我能想到但没有奏效的可能性。

我有一张空白表tbl_Z。我正在尝试 LEFT JOIN tbl_Atbl_B 并将结果加载到 tbl_Z 并根据此处显示的 2 个 SQL 语句中的条件从 tbl_A 更新 tbl_Z 中的 Status 列:

INSERT INTO tbl_Z
    SELECT a.*
    FROM tbl_A a
    LEFT JOIN tbl_B b ON a.AccountNumber = b.AccountNumber
    WHERE a.Period = '09/30/2021'
      AND b.AccountNumber IS NULL

UPDATE Z
SET Status = (SELECT 
                  f.ContractDate, f.BK_Date, f.Period,
                  CASE
                      WHEN ISNULL(f.ContractDate, '1/1/1900') < ISNULL(f.BK_Date, '1/1/1900') AND f.BK_Date < ISNULL(f.Period, '1/1/1900') 
                          THEN 'Bankrupt.Attrit'
                          ELSE 'Attrit'
                  END AS Status
              FROM 
                  tbl_A f
              WHERE 
                  Period = '09/30/2021')

任何帮助将不胜感激。

【问题讨论】:

  • 您正在尝试设置单个 Status 列 - 但您的子查询返回 4 (!!!) 列 - 这应该如何工作?而且您正在设置单行的Status 列 - 但您的子查询可能会返回多行......
  • update块中:将目标表和源表连接为from tbl_Z join tbl_Aset tbl_Z.Status = tbl_A.yourValue

标签: sql insert case


【解决方案1】:

我不知道字段名称,只是在select中添加字段名称,将case语句按字段的写入顺序。

INSERT INTO tbl_Z
    SELECT -- please write your all tbl_A fields here and then place below case in write order of selection
            , 
               CASE
                 WHEN ISNULL(f.ContractDate, '1/1/1900') < ISNULL(f.BK_Date, '1/1/1900') 
                      AND f.BK_Date < ISNULL(f.Period, '1/1/1900') 
                       THEN 'Bankrupt.Attrit'
                 ELSE 'Attrit'
                 END AS Status
    FROM tbl_A a
    LEFT JOIN tbl_B b ON a.AccountNumber = b.AccountNumber
    WHERE a.Period = '09/30/2021'
      AND b.AccountNumber IS NULL;

【讨论】:

  • 您好,法尔希德。谢谢您的答复。但是,当我尝试运行上述语句时,仍然出现此错误,“INSERT 语句的选择列表包含的项目多于插入列表。SELECT 值的数量必须与 INSERT 列的数量相匹配。”如果我注释掉 CASE 语句,那么这些语句运行良好。这里要注意的一件事是,在我的 select 语句中有 30 个字段,我将这 30 个字段插入到 tble_1 中。但是我的 CASE 语句有 4 个字段。这与我遇到的错误有什么关系吗?
  • @FarukAnsari 您插入到 tbl_Z 的状态字段中的 tbal_A 中的字段名称是什么?
  • tbl_A 中没有为此的字段名称。 Status 的值由 ContractDate、BK_Date 和 Period 值确定。当 ISNULL(f.ContractDate, '1/1/1900')
  • @FarukAnsari 在这种情况下,您应该列出来自 tbl_A 的所有字段,如下所示:插入 tbl_z(字段名称在此处)选择 tbl_A 字段名称,case .. end as status from ...
猜你喜欢
  • 2018-02-28
  • 1970-01-01
  • 1970-01-01
  • 2020-07-09
  • 2011-07-08
  • 2021-07-18
  • 2020-10-11
  • 2012-10-24
  • 1970-01-01
相关资源
最近更新 更多