我有一张公司信息表(名称,总部国家/地区,等等)和国家名称列表。
我想查看哪些公司的名称中包含国家/地区名称,但总部不在该国家/地区。
我有一个简单的SQL查询,一次可以执行一次,但是我想编写一个查询,使所有国家/地区都能通过。
现在,我的where子句实际上看起来像
WHERE company LIKE '%CANADA%'
AND hq_country_full != 'CANADA'
我也尝试使用子查询,但无法弄清楚这一点。我在想我可能需要使用局部变量,但不确定如何设置它。任何帮助,将不胜感激!
答案 0 :(得分:2)
也许是这样?
declare @Company table (company varchar(128), hq_country_full varchar(128));
insert @Company values
('Canada Company', 'Canada'),
('Non-Canada Company', 'Mexico'),
('Mexico Company', 'Mexico'),
('Non-Mexico Company', 'Canada');
declare @Country table (country varchar(128));
insert @Country values
('Canada'),
('Mexico');
select
Company.*
from
@Company Company
where
exists (select 1 from @Country Country where
Company.hq_country_full != Country.country and
Company.company like '%' + Country.country + '%');
结果:
company hq_country_full
Non-Canada Company Mexico
Non-Mexico Company Canada
我选择半联接(exists
)而不是左联接,因为从理论上讲,一家公司可以满足您为多个国家/地区描述的标准,所以我认为您只想在这种情况下一次出现在结果集中的国家/地区。如果要在这种情况下获得多个结果,请改用左联接。
答案 1 :(得分:1)
您可以将带有国家名称的列表放在表中。甚至可以是#temporary表或@table变量。
之后,您可以使用LIKE将公司信息表加入国家名称表。
-- Using a table variable for the example
declare @countrynames table (name varchar(80) primary key);
insert into @countrynames (name) values
('CANADA')
,('BELGIUM')
,('RUSSIA')
,('USA');
SELECT
comp.company,
comp.hq_country_full
ctry.name as countryName
FROM companyinfo comp
JOIN @countrynames as ctry
ON comp.company LIKE '%'+ctry.name+'%'
WHERE comp.hq_country_full != ctry.name
答案 2 :(得分:0)
由于您拥有hq_country_full列,因此您可以在LIKE子句中使用它:
WHERE company NOT LIKE '%' + hq_country_full + '%'