如何查询不包含若干关键词的记录

mannxp 2018-02-01 01:52:02

如图所示:

原材料列记录大约有数万条。关键词记录大约有数千条。

如何查出不包含任何一个右侧关键词的原材料记录。

如图中绿色
...全文
651 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
mannxp 2018-02-10
  • 打赏
  • 举报
回复
非常感谢楼上的回复! 最终我发现直接用not like and not like 也可以实现功能,只是效率不行。 用存储过程也可以实现。还有就是把数据放在程序中处理。
zjcxc 2018-02-01
  • 打赏
  • 举报
回复
不过, LIKE 的效率肯定不太高,尤其在数据量大时列明显,特别是你这个需求是每条业务数据的每个关键字都要检查一次的 要循环建议你在程序中去做, 在数据库中做循环,通常效率比直接查询更慢,在程序你还可以考虑多线程,SQL Server中就没这个能力了(直接写查询会根据情况自动确定并行的,这也是不在数据库中自己写循环的一个原因)
zjcxc 2018-02-01
  • 打赏
  • 举报
回复
就两个表,一个数据表,一个关键字表,这是你数据库中应该具备的 查询只是做个 NOT EXISTS,只有这个查询是实现你需求的 不知道楼主哪里看出复杂了?你不会把人家示例的表和数据也算上吧?
吉普赛的歌 2018-02-01
  • 打赏
  • 举报
回复
引用 4 楼 mannxp 的回复:
@二月十六 @_大约在冬季_ @听雨停了 我觉得是不是直接写SQL语句查询太复杂了?毕竟关键词有好几百上千个。 我觉得可以使用存储过程。for循环完成。 请问这个存储过程怎么写啊?
你这个SQL 谈不上复杂, 但几千*几万的扫描, 还是模糊搜索, 如果服务器性能一般,实际运行可能还是非常吃力的, 所以, 我还是在 #5 帮你写了循环完成的办法。 实际的情况怎么样, 你可以对比试试: 哪种更快一点?
OwenZeng_DBA 2018-02-01
  • 打赏
  • 举报
回复
引用 4 楼 mannxp 的回复:
@二月十六 @_大约在冬季_ @听雨停了 我觉得是不是直接写SQL语句查询太复杂了?毕竟关键词有好几百上千个。 我觉得可以使用存储过程。for循环完成。 请问这个存储过程怎么写啊?
在数据库中处理数据的时候,尽量用集合的思想。
听雨停了 2018-02-01
  • 打赏
  • 举报
回复
引用 4 楼 mannxp 的回复:
@二月十六 @_大约在冬季_ @听雨停了 我觉得是不是直接写SQL语句查询太复杂了?毕竟关键词有好几百上千个。 我觉得可以使用存储过程。for循环完成。 请问这个存储过程怎么写啊?
简单的sql可以完成的,为什么要用存储过程搞得这么复杂啊?不就是为了解决这个问题吗?还不是怎么省事怎么来啊,for循环只会用更久的时间
吉普赛的歌 2018-02-01
  • 打赏
  • 举报
回复
引用 4 楼 mannxp 的回复:
@二月十六 @_大约在冬季_ @听雨停了 我觉得是不是直接写SQL语句查询太复杂了?毕竟关键词有好几百上千个。 我觉得可以使用存储过程。for循环完成。 请问这个存储过程怎么写啊?
--材料表
DECLARE @t TABLE (
	id INT IDENTITY(1,1) PRIMARY KEY,
    mat NVARCHAR(50)
)
INSERT INTO @t VALUES ('abcd')
INSERT INTO @t VALUES ('bcd')
INSERT INTO @t VALUES ('abd')
INSERT INTO @t VALUES ('ae')
INSERT INTO @t VALUES ('bec')
INSERT INTO @t VALUES ('fcab')
--关键字表
DECLARE @k TABLE (
	keyword NVARCHAR(20)
)
INSERT INTO @k VALUES ('ab')
INSERT INTO @k VALUES ('bc')
--结果表
DECLARE @r TABLE (
	id INT PRIMARY KEY,
    mat NVARCHAR(50)
)

DECLARE @i INT,@imax INT
SELECT @i=MIN(id),@imax=MAX(id) FROM @t

WHILE @i<=@imax
BEGIN
	INSERT INTO @r (id,mat)
	SELECT a.id,a.mat FROM @t AS a WHERE a.id=@i AND not EXISTS(
		SELECT 1 FROM @k AS b WHERE b.keyword>'' AND a.mat LIKE '%'+b.keyword+'%'   
	)
	SET @i=@i+1
END

SELECT * FROM @r
/*
id	mat
4	ae
5	bec 
*/
mannxp 2018-02-01
  • 打赏
  • 举报
回复
@二月十六 @_大约在冬季_ @听雨停了 我觉得是不是直接写SQL语句查询太复杂了?毕竟关键词有好几百上千个。 我觉得可以使用存储过程。for循环完成。 请问这个存储过程怎么写啊?
听雨停了 2018-02-01
  • 打赏
  • 举报
回复


use Tempdb
go
--> --> 听雨停了-->生成测试数据
--原材料表
if not object_id(N'Tempdb..#tabA') is null
drop table #tabA
Go
Create table #tabA([原材料] nvarchar(24))
Insert #tabA
select N'美国香蕉' union all
select N'云南香蕉' union all
select N'北京鸭梨' union all
select N'云南米线' union all
select N'广东大米'
Go
--关键词表
if not object_id(N'Tempdb..#tabB') is null
drop table #tabB
Go
Create table #tabB([关键词] nvarchar(22))
Insert #tabB
select N'香蕉' union all
select N'大米'
Go
--测试数据结束


SELECT * FROM #tabA a
WHERE NOT EXISTS (
SELECT a.* FROM #tabB b
WHERE CHARINDEX(b.关键词,a.原材料)>0
)

吉普赛的歌 2018-02-01
  • 打赏
  • 举报
回复
DECLARE @t TABLE (
	mat NVARCHAR(50),
	keyword NVARCHAR(20)
)
INSERT INTO @t VALUES ('abcd','ab')
INSERT INTO @t VALUES ('bcd','bc')
INSERT INTO @t VALUES ('abd','')
INSERT INTO @t VALUES ('ae','')
INSERT INTO @t VALUES ('bec','')
INSERT INTO @t VALUES ('fcab','')

SELECT * FROM @t AS a WHERE not EXISTS(
SELECT 1 FROM @t AS b WHERE b.keyword>'' AND a.mat LIKE '%'+b.keyword+'%'	
)
/*
mat	keyword
ae	
bec	
*/
二月十六 2018-02-01
  • 打赏
  • 举报
回复
--测试数据
if not object_id(N'Tempdb..#T1') is null
drop table #T1
Go
Create table #T1([原材料] nvarchar(25))
Insert #T1
select N'粉状增合剂' union all
select N'氨基磺酸'
GO
if not object_id(N'Tempdb..#T2') is null
drop table #T2
Go
Create table #T2([关键词] nvarchar(22))
Insert #T2
select N'粉状'
Go
--测试数据结束
SELECT *
FROM #T1
WHERE NOT EXISTS ( SELECT *
FROM #T2
WHERE 原材料 LIKE '%' + 关键词 + '%' )


爱易批量关键字排名查询seo工具是一款简洁、实用的批量关键词排名查询工具。软件还有若干精彩的特色功能,如:seo综合数据查询、生成排名曲线、查看网站历史数据、批量网站关键词导入等等。本工具由由爱易工作室原创设计开发。   附:爱易seo工具可查询的网站seo数据,包括:百度快照、百度收录、百度反链、百度当天收录、百度关键词排名、百度指数、谷歌pr值等等。   郑重说明:软件由易语言开发,所有易语言程序杀毒软件都会有病毒提示,这是正常反应。只要设置杀毒软件信任就可以正常使用。 本软件由爱易原创开发,绝对不含病毒代码!   爱易关键词查询seo工具的特色功能: 1、百度关键词排名批量查询。(站长工具只能单个查询或者只能查询少量关键词排名。) 2、自动生成关键词排名变化曲线,让您的关键词排名变化情况一目了然。 3、可以自动生成网站历史数据:包括百度快照、百度收录情况、百度反链情况都有记录。 4、批量查询网站与关键词导入,适合大批量网站与关键词排名查询。   爱易查询工具的具体功能包括: 1、可以方便批量管理目标网站,包括:批量导入,添加、删除等操作。 2、可以方便的添加删除、批量导入网站关键词。 3、可以查询网站重要seo数据,包括:百度快照、百度收录、百度反链、百度当天收录、百度关键词排名、百度指数、谷歌pr值等等。 4、可以批量查询网站关键词百度排名。 5、可以生成关键词排名变化曲线等一系列数据变化曲线。 6、可以生成网站历史数据。   爱易批量关键字排名查询seo工具 v6.4 更新 增加了多种特色功能,如:网站内页关键词排名查询、降权网站查询、百度权重查询、批量网址收录检测查询等等。排除了网站查询过程中容易自动退出的Bug;处理了网站查询过程中容易卡死的问题。爱易seo工具健壮性大大提升。

22,207

社区成员

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

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