0

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

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 的那些设置行业 ID,但它实际上将每条记录设置为相同的 ID。不管 sic 数是否在 0-499 之间。

为什么是这样。

4

2 回答 2

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

(这可以避免错误——因为你已经让他们——有人在列中输入了一个非数字值。)

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

于 2013-04-17T13:48:51.947 回答
1

更改left joininner join

于 2013-04-17T13:43:01.640 回答