【问题标题】:SQL Update and Join updating wrong recordsSQL Update 和 Join 更新错误记录
【发布时间】:2017-06-08 15:15:52
【问题描述】:

我正在尝试在 SQL Server 上使用带有 JOIN 的 UPDATE 语句。

如果我运行下面的 SELECT 语句,它会返回 42 行。

SELECT * FROM [dbo].[Imported] i 
inner join [DaisyCompare].[dbo].[Baseline] b
on 
b.[CLI]=i.[CLI] AND 
b.[Quantity]=i.[Quantity] AND 
b.[UnitCost]=i.[UnitCost] AND 
b.[TotalCost]=i.[TotalCost] AND 
b.[Description]=i.[Description] 

WHERE b.[CLI]=i.[CLI] AND 
b.[Quantity]=i.[Quantity] AND 
b.[UnitCost]=i.[UnitCost] AND 
b.[TotalCost]=i.[TotalCost] AND 
b.[Description]=i.[Description]

但是,当我在更新语句(如下)中使用它作为条件时,查询会更新 44 条记录。

update [DaisyCompare].[dbo].[Baseline]

set Disposition = ('Match')

where exists (
SELECT * FROM [dbo].[Imported] i 
inner join [DaisyCompare].[dbo].[Baseline] b

on 
b.[CLI]=i.[CLI] AND 
b.[Quantity]=i.[Quantity] AND 
b.[UnitCost]=i.[UnitCost] AND 
b.[TotalCost]=i.[TotalCost] AND 
b.[Description]=i.[Description] 

WHERE b.[CLI]=i.[CLI] AND 
b.[Quantity]=i.[Quantity] AND 
b.[UnitCost]=i.[UnitCost] AND 
b.[TotalCost]=i.[TotalCost] AND 
b.[Description]=i.[Description] )

大概是我的语法错误,但我不确定在哪里。

非常感谢任何帮助。

【问题讨论】:

  • 因为您的 EXISTS 逻辑正在检查行是否存在并且没有相关性。我会摆脱 EXISTS 并只使用连接。另外,这里的 where 子句有什么意义?它已经在连接谓词中处理。

标签: sql sql-server join


【解决方案1】:

你可以使用普通的更新语法和一个连接,你只需要连接谓词,where子句是多余的:

UPDATE b
SET Disposition = 'Match'
FROM [dbo].[Imported] i 
INNER JOIN [DaisyCompare].[dbo].[Baseline] b
ON
b.[CLI]=i.[CLI] AND 
b.[Quantity]=i.[Quantity] AND 
b.[UnitCost]=i.[UnitCost] AND 
b.[TotalCost]=i.[TotalCost] AND 
b.[Description]=i.[Description] 

【讨论】:

    【解决方案2】:

    “存在”绝对是问题所在。您可以使用 IN 并引用主键是什么。

    update [DaisyCompare].[dbo].[Baseline]
    
    set Disposition = ('Match')
    
    where [DaisyCompare].[dbo].[Baseline].[PrimaryID] IN
     (
    SELECT [b.PrimaryID] FROM [dbo].[Imported] i 
    inner join [DaisyCompare].[dbo].[Baseline] b
    
    on 
    b.[CLI]=i.[CLI] AND 
    b.[Quantity]=i.[Quantity] AND 
    b.[UnitCost]=i.[UnitCost] AND 
    b.[TotalCost]=i.[TotalCost] AND 
    b.[Description]=i.[Description] 
    
    WHERE b.[CLI]=i.[CLI] AND 
    b.[Quantity]=i.[Quantity] AND 
    b.[UnitCost]=i.[UnitCost] AND 
    b.[TotalCost]=i.[TotalCost] AND 
    b.[Description]=i.[Description] )
    

    【讨论】:

      【解决方案3】:

      您可以使用别名来选择要更新的连接表

      UPDATE b
      SET Disposition = 'Match'
      FROM [dbo].[Imported] i 
      inner join [DaisyCompare].[dbo].[Baseline] b
      on 
      b.[CLI]=i.[CLI] AND 
      b.[Quantity]=i.[Quantity] AND 
      b.[UnitCost]=i.[UnitCost] AND 
      b.[TotalCost]=i.[TotalCost] AND 
      b.[Description]=i.[Description] 
      

      【讨论】:

      • 我会去掉 where 子句。这是多余的,因为所有这些条件都已在内部连接中匹配。
      • 公平点,我没有深究并复制粘贴,为我提供了懒惰的权利
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-19
      • 2022-10-17
      • 2018-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多