SQL Update不为null时

时间:2014-07-10 11:12:59

标签: sql sql-server

我只是在原始列为空时尝试在fabcon表中设置一个列。

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

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

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

谁能看到我出错的地方?

感谢。 :)

编辑:两个表fabcon和spreadsheetData由一个名为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;

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

4 个答案:

答案 0 :(得分:0)

您需要表格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子句以进行更新。这可以防止查询不必要地更新行(使用未更改的值)。

答案 1 :(得分:0)

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

可能是我想的作品

答案 2 :(得分:0)

这对你有用。假设我已正确理解您的原始查询

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匹配

答案 3 :(得分:0)

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”,这可能有用。

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