我在执行此查询时遇到问题:
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之间。
为什么会这样。
答案 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