两张表合成的问题
A表
名称
安徽江淮汽车集团有限公司
广东健力宝集团有限公司
海尔集团公司
国家电网
B表
名称
海尔集团
健力宝
加多宝
哈药集团有限公司
北京同仁堂
国家电网公司
需合成C表
安徽江淮汽车集团有限公司
广东健力宝集团有限公司
海尔集团公司
加多宝
哈药集团有限公司
北京同仁堂
国家电网公司
就是A表根据关键字去除B表里面的
B表根据关键字去除A表里面的 得到了C表。 用like好像不行
[最优解释]
select * into #tb from A
union all
select * from B
delete a from #tb a
where exists(select 1 from #tb where 名称 like '%'+a.名称+'%' and len(名称)>len(a.名称))
select * from #tb
[其他解释]
select *
from
a inner join b on a.主键=b.主键
inner join c on b.主键=c.主键
select 名称
from TBA a
where not exists(select 1 from TBB where 名称 like '%'+a.名称+'%')
union all
select 名称
from TBB b
where not exists(select 1 from TBA where 名称 like '%'+b.名称+'%')
if OBJECT_ID('tb1') is not null
drop table tb1
if OBJECT_ID('tb2') is not null
drop table tb2
go
create table tb1(name varchar(40))
create table tb2(name varchar(40))
insert into tb1
values( '安徽江淮汽车集团有限公司'),
('广东健力宝集团有限公司'),
('海尔集团公司'),
('国家电网')
insert into tb2
select '海尔集团' union all
select '健力宝' union all
select '加多宝' union all
select '哈药集团有限公司' union all
select '北京同仁堂' union all
select '国家电网公司'
;with sel as
(select name from tb1 union all
select name from tb2)
select distinct name from sel except(select a.name from tb1 a,tb2 b
where CHARINDEX(a.name,b.name)>0 union all
select b.name from tb1 a,tb2 b
where CHARINDEX(b.name,a.name)>0 )
/*
name
----------------------------------------
安徽江淮汽车集团有限公司
北京同仁堂
广东健力宝集团有限公司
国家电网公司
哈药集团有限公司
海尔集团公司
加多宝
(7 row(s) affected)
*/
----------------------------
-- Author :TravyLee(物是人非事事休,欲语泪先流!)
-- Date :2012-11-21 14:32:35
-- Version:
-- Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86)
--Jul 9 2008 14:43:34
--Copyright (c) 1988-2008 Microsoft Corporation
--Developer Edition on Windows NT 6.1 <X86> (Build 7601: Service Pack 1)
--
----------------------------
--> 测试数据:[A表]
if object_id('[A表]') is not null drop table [A表]
go
create table [A表]([名称] varchar(24))
insert [A表]
select '安徽江淮汽车集团有限公司' union all
select '广东健力宝集团有限公司' union all
select '海尔集团公司' union all
select '国家电网'
--> 测试数据:[B表]
if object_id('[B表]') is not null drop table [B表]
go
create table [B表]([名称] varchar(16))
insert [B表]
select '海尔集团' union all
select '健力宝' union all
select '加多宝' union all
select '哈药集团有限公司' union all
select '北京同仁堂' union all
select '国家电网公司'
go
;with t
as(
select
isnull(a.名称,b.名称) as 名称A,
isnull(b.名称,a.名称) as 名称B
from
[A表] a
full join
[B表] b
on
charindex(a.名称,b.名称)>0 or charindex(b.名称,a.名称)>0
)
select
case when len(名称A)>=len(名称B) then 名称A else 名称B end as 名称
from t
/*
名称
------------------------
安徽江淮汽车集团有限公司
广东健力宝集团有限公司
海尔集团公司
国家电网公司
加多宝
哈药集团有限公司
北京同仁堂
(7 行受影响)
*/
--BEGIN 创建表结构并插入数据
if OBJECT_ID('tb1') is not null drop table tb1
if OBJECT_ID('tb2') is not null drop table tb2
go
create table tb1(name varchar(40))
create table tb2(name varchar(40))
insert into tb1
values( '安徽江淮汽车集团有限公司'), ('广东健力宝集团有限公司'), ('海尔集团公司'),('国家电网')
insert into tb2
select '海尔集团' union all
select '健力宝' union all
select '加多宝' union all
select '哈药集团有限公司' union all
select '北京同仁堂' union all
select '国家电网公司'
--END
SELECT * FROM tb1 AS t1
SELECT * FROM tb2 AS t2
---输出结果
SELECT CASE WHEN LEN(isnull(t1.name,''))>LEN(isnull(t2.name,'')) THEN t1.name
ELSE t2.name END AS Name
FROM tb1 t1
FULL JOIN tb2 t2 ON (CHARINDEX(t1.name,t2.name)>0 OR CHARINDEX(t2.name,t1.name)>0)
create table someGroup1
(
id int primary key,
groupName varchar(50)
)
insert into someGroup1 values(1,'安徽江淮汽车集团有限公司')
insert into someGroup1 values(2,'广东健力宝集团有限公司')
insert into someGroup1 values(3,'海尔集团公司')
insert into someGroup1 values(4,'国家电网')
insert into someGroup1 values(5,'哈药集团')
create table someGroup2
(
id int primary key,
groupName varchar(50)
)
insert into someGroup2 values(1,'海尔集团')
insert into someGroup2 values(2,'健力宝')
insert into someGroup2 values(3,'加多宝')
insert into someGroup2 values(4,'哈药集团有限公司')
insert into someGroup2 values(5,'北京同仁堂')
insert into someGroup2 values(6,'国家电网公司')
select * from someGroup1
select * from someGroup2
--得到表一中名称非
-- 国家电网
-- 哈药集团 的公司名称并写入新表tb1
select distinct s1.groupName into tb1 from someGroup1 as s1,someGroup2 as s2
where
CHARINDEX(s2.groupName,s1.groupName) = 0 and s1.groupName
not in(
--得到 国家电网
-- 哈药集团
select s1.groupName from someGroup1 as s1,someGroup2 as s2
where CHARINDEX(s1.groupName,s2.groupName) >= 1 )
--得到表一中名称非
-- 健力宝
-- 海尔集团 的公司名称并写入新表tb2
select distinct s2.groupName into tb2 from someGroup2 as s2
where s2.groupName not in
(
--得到 健力宝
--得到 海尔集团
select s2.groupName from someGroup1 as s1,someGroup2 as s2
where CHARINDEX(s2.groupName,s1.groupName) >=1
)
select groupName from tb1
union all
select groupName from tb2