sql查询更新所有行,而不仅仅是where子句

时间:2013-04-17 13:40:59

标签: sql sql-server

我在执行此查询时遇到问题:

update public.fortune_companies 
set industry_id = (select id 
                   from public.industries 
                   where name = 'Agriculture, Forestry and Fishing') 
from Temp_Sic_Fortune_Companies as temp 
left join public.fortune_companies as fc on fc.account_name = temp.account_name
where temp.sic between '0' and '499';

我认为这应该只为那些sic数为0-499的行设置industry_id,但它实际上将每条记录设置为相同的id。无论sic号是否在0-499之间。

为什么会这样。

2 个答案:

答案 0 :(得分:2)

DECLARE @id INT;

SELECT @id = id 
  FROM public.industries 
  WHERE name = 'Agriculture, Forestry and Fishing';

UPDATE fc
  SET industry_id = @id
  FROM public.fortune_companies AS fc
  WHERE EXISTS
  (
    SELECT 1 
      FROM dbo.Temp_Sic_Fortune_Companies
      WHERE account_name = fc.account_name
      AND sic BETWEEN '0' and '499'
  );

当然,如果temp.sic = '3000',它将成为该集合的一部分。这是使用错误数据类型(或错误的运算符)的危险之一。您可以通过说:

来解决这个问题
AND sic BETWEEN '0' and '499'
AND LEN(sic) <= 3

或者说:

AND CASE WHEN ISNUMERIC(sic) = 1 THEN 
  CONVERT(INT, sic) ELSE -1 END BETWEEN 0 AND 499

(如果 - 因为你让他们 - 有人在列中输入非数字值,这可以避免错误。)

或者首先使用正确的数据类型。

答案 1 :(得分:1)

left join更改为inner join