sqlserver如何对比两个表的数据

梦在别离时 2018-11-20 09:08:14
两个数据库中的两张表,一个表A,一个表B。
两张表有大致相同的两列col1,col2。由于是医院的数据,两列中的数据名字可能不太相同,但是同一种意思。
例如表A中可能叫'' 一次性针筒'',表B中可能就是叫''(jk)一次性针筒''。请问这种情况如何对比两张表中的数据,筛选出未包含的数据。
谢谢!
...全文
1197 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
上海晴了 2018-11-26
  • 打赏
  • 举报
回复
引用 1 楼 吉普赛的歌的回复:
USE tempdb
GO
IF OBJECT_ID('ta') IS NOT NULL DROP TABLE ta
IF OBJECT_ID('tb') IS NOT NULL DROP TABLE tb
GO
CREATE TABLE ta(
	col1 NVARCHAR(500)	
)
CREATE TABLE tb(
	col2 NVARCHAR(500)	
)
GO
INSERT INTO ta VALUES (N'一次性针筒')
INSERT INTO ta VALUES (N'甲肝疫苗')
--
INSERT INTO tb VALUES (N'(jk)一次性针筒')
INSERT INTO tb VALUES (N'丙肝疫苗')
GO
-------- 以上为测试数据 ------------

SELECT 'ta' AS tableName,col1 AS diff  FROM ta WHERE NOT EXISTS(
	SELECT * FROM tb WHERE ta.col1 LIKE '%'+tb.col2+'%'	
)
AND NOT EXISTS (
	SELECT * FROM tb WHERE tb.col2 LIKE '%'+ta.col1+'%'
)
UNION ALL
SELECT 'tb' AS tableName,col2 AS diff  FROM tb WHERE NOT EXISTS(
	SELECT * FROM ta WHERE ta.col1 LIKE '%'+tb.col2+'%'	
)
AND NOT EXISTS (
	SELECT * FROM ta WHERE tb.col2 LIKE '%'+ta.col1+'%'
)

/*
tableName diff
--------- ----------
ta        甲肝疫苗
tb        丙肝疫苗
*/


每一个查询语句后为什么要跟一个 and no exists?
梦在别离时 2018-11-20
  • 打赏
  • 举报
回复
谢谢各位了,麻烦你们了,谢谢
二月十六 2018-11-20
  • 打赏
  • 举报
回复
SELECT
*
FROM
[中心医院疑点库2016-2017].[dbo].[一次性耗材2016-2017]
WHERE
NOT EXISTS
(
SELECT
*
FROM
[物价数据].[dbo].[一次性耗材目录]
WHERE
项目名称 LIKE '%' + 耗材名称 + '%'
OR 耗材名称 LIKE '%' + 项目名称 + '%'
);
梦在别离时 2018-11-20
  • 打赏
  • 举报
回复
一张表的结构 SELECT TOP 1000 [住院流水号] ,[病人姓名] ,[项目名称] ,[零售价] ,[结平日期] FROM [中心医院疑点库2016-2017].[dbo].[一次性耗材2016-2017] 另一张表结构 SELECT TOP 1000 [耗材名称] FROM [物价数据].[dbo].[一次性耗材目录] 数据库版本是服务器上的sqlserver2008R2企业版 其中‘项目名称’和‘耗材名称’是大概一样的数据,但是物价数据中列出的数据只有500多条,疑点库中有10多万条 不知道怎么对比筛选出疑点库中项目名称没有包含在物价数据中的数据,而且两张表中的数据名字可能叫法不同但是是同一件物品 麻烦你们了,谢谢
吉普赛的歌 2018-11-20
  • 打赏
  • 举报
回复
你清楚的, 人家并不清楚, 你要给出 1. 两张表的表结构脚本, 2. 适量的测试数据 3. 期望结果 4. sqlserver 的版本 select @@version; 这样人家才能更好地帮你
梦在别离时 2018-11-20
  • 打赏
  • 举报
回复
谢谢你们给的方法,但是不适用,因为两张表中的数据量也不一样。有没有什么其他更好的方法对比了
mingqing6364 2018-11-20
  • 打赏
  • 举报
回复
SELECT
CASE
WHEN ta.col1 IS NULL THEN 'tb' ELSE 'ta'
END table_name,
ISNULL( dbo.ta.col1, dbo.tb.col2 ) col
FROM
dbo.ta
FULL OUTER JOIN dbo.tb ON '%' + dbo.tb.col2 + '%' LIKE '%' + dbo.ta.col1 + '%'
WHERE
dbo.ta.col1 + dbo.tb.col2 IS NULL
二月十六 2018-11-20
  • 打赏
  • 举报
回复
这种的必须有确定的规则,否则出来的肯定不会准确,只能是大概,没有规则只能用很模糊的查询,比如这样:
--测试数据
if not object_id(N'A') is null
drop table A
Go
Create table A([col1] nvarchar(27))
Insert A
select N'一次性针筒' union all
select N'一次性的管' union all
select N'一次性的输液瓶'
GO
if not object_id(N'B') is null
drop table B
Go
Create table B([col2] nvarchar(29))
Insert B
select N'(jk)一次性针筒' union all
select N'一次性管子' union all
select N'一次性输液用的瓶子'
Go
--测试数据结束
Select * from A WHERE NOT EXISTS(SELECT * FROM B WHERE col1 LIKE '%'+col2+'%' OR col2 LIKE '%'+col1+'%')
UNION ALL
Select * from B WHERE NOT EXISTS(SELECT * FROM A WHERE col1 LIKE '%'+col2+'%' OR col2 LIKE '%'+col1+'%')




虽然楼主给的例子“一次性针筒''和''(jk)一次性针筒''排除了,但是像例子中的那些管子瓶子的就没有筛选出来,这个我只是举例子,实际情况会有更多,所以楼主最好能总结一个规则,或者做好不会太准确的准备
吉普赛的歌 2018-11-20
  • 打赏
  • 举报
回复
USE tempdb
GO
IF OBJECT_ID('ta') IS NOT NULL DROP TABLE ta
IF OBJECT_ID('tb') IS NOT NULL DROP TABLE tb
GO
CREATE TABLE ta(
	col1 NVARCHAR(500)	
)
CREATE TABLE tb(
	col2 NVARCHAR(500)	
)
GO
INSERT INTO ta VALUES (N'一次性针筒')
INSERT INTO ta VALUES (N'甲肝疫苗')
--
INSERT INTO tb VALUES (N'(jk)一次性针筒')
INSERT INTO tb VALUES (N'丙肝疫苗')
GO
-------- 以上为测试数据 ------------

SELECT 'ta' AS tableName,col1 AS diff  FROM ta WHERE NOT EXISTS(
	SELECT * FROM tb WHERE ta.col1 LIKE '%'+tb.col2+'%'	
)
AND NOT EXISTS (
	SELECT * FROM tb WHERE tb.col2 LIKE '%'+ta.col1+'%'
)
UNION ALL
SELECT 'tb' AS tableName,col2 AS diff  FROM tb WHERE NOT EXISTS(
	SELECT * FROM ta WHERE ta.col1 LIKE '%'+tb.col2+'%'	
)
AND NOT EXISTS (
	SELECT * FROM ta WHERE tb.col2 LIKE '%'+ta.col1+'%'
)

/*
tableName diff
--------- ----------
ta        甲肝疫苗
tb        丙肝疫苗
*/


22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧