【问题标题】:SQL Update when not null不为空时的 SQL 更新
【发布时间】:2014-07-10 20:26:59
【问题描述】:

我试图在 fabcon 表中设置一列,仅当原始列为空时。

这是我已经尝试过的代码。

UPDATE  dbo.fabcon
SET     ext = COALESCE(ext, ( SELECT CASE WHEN [<3] IS NOT NULL THEN '3' END AS     extent
                                       FROM dbo.spreadsheetData ))

这是我得到的错误: 子查询返回超过 1 个值。当子查询跟在=, !=, &lt;, &lt;= , &gt;, &gt;= 之后或当子查询用作表达式时,这是不允许的。

谁能看出我哪里出错了?

谢谢。 :)

编辑:fabcon 和电子表格数据这两个表由名为 main1 的列链接

EDIT2:我已将查询更新为:

UPDATE dbo.fabcon
 SET  ext = (SELECT CASE WHEN [<3] IS NOT NULL THEN '3' END 
          FROM dbo.spreadsheetData ssd
          WHERE ssd.id = fabcon.id
         )
 WHERE ext IS NULL;

但是,它仍然失败并出现同样的错误。

【问题讨论】:

  • 你的两张表有什么关系?
  • 原始列表示两个表之间存在链接,您可以使用该链接。链接是什么?
  • 请使用示例数据和所需结果编辑您的问题。错误信息非常明显。您的子查询返回不止一行。它甚至没有where 子句,所以这并不奇怪。
  • 我已经更新了原始问题。感谢您的反馈。
  • 所以表 spreadsheetData 和 fabcon 是 1:1 相关的并且具有相同的 id?这是一个可能的模型,但你不会得到错误。所以很明显这些表不是 1:1 相关的,它们没有相同的 id,语句可能应该是这样的:WHERE ssd.id = fabcon.id_ssd

标签: sql sql-server


【解决方案1】:

您需要表 fabconspreadsheetData 之间的链接。假设它被称为id

UPDATE dbo.fabcon
  SET  ext = (SELECT CASE WHEN [<3] IS NOT NULL THEN '3' END) 
              FROM dbo.spreadsheetData ssd
              WHERE ssd.id = fabcon.id
             )
  WHERE ext IS NULL;

请注意,我删除了 coalesce() 并将其替换为 where 子句以进行更新。这可以防止查询不必要地更新行(值不变)。

【讨论】:

    【解决方案2】:
    DECLARE @PAth INT 
     Select @path =  COALESCE(ext,'')+[<3]+';' FROM  dbo.spreadsheetData 
    
    UPDATE dbo.fabcon
                SET     ext = CASE WHEN @PAth IS NOT NULL 
            THEN '3' ELSE '' 
             END AS Extent
                 FROM dbo.fabcon f WHERE f.id = @path
    

    我认为这可能是有效的

    【讨论】:

      【解决方案3】:

      这应该适合你。假设我正确理解了您的原始查询

      UPDATE dbo.fabcon 
        SET 
          ext = ssd.[column to insert data from]
      FROM 
          dbo.spreadsheetData ssd
      WHERE 
          ext IS NULL
          AND 
              fabcon.id = ssd.id
      

      这假定 ssd 表中的 id 是 fabcon 表中的 id。否则,只需根据您的列规范更改 id 匹配

      【讨论】:

        【解决方案4】:
        UPDATE dbo.fabcon
         SET  ext = (SELECT TOP 1 CASE WHEN [<3] IS NOT NULL THEN '3' END 
                  FROM dbo.spreadsheetData ssd
                  WHERE ssd.main1 = fabcon.main1
                  ORDER BY 1
                 )
         WHERE ext IS NULL;
        

        通过“main1”(如现在所示)关联的 2 个表和为避免错误而抛出的任意“TOP 1”,这可能有效。

        但是:获得答案的最佳方式是提供一些样本数据和预期结果

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-24
          • 1970-01-01
          • 2019-04-16
          • 1970-01-01
          • 2021-06-18
          • 1970-01-01
          相关资源
          最近更新 更多