美好的一天伙计们,您能帮我解决我的SQL查询吗?我在网上的proj上打电话给我查询好的是我可以将搜索到的数据的日志文件存储到我的项目中,然后输入我的查询搜索框。
这是在查询中搜索到的关键字表:
本准则:
Insert into #temptable
Select CaseNo from tblcrew
where Lastname like '%FABIANA%'
and firstname like '%MARLON%'
Insert into #temptable
Select CaseNo from tblcrew
where Lastname like '%DE JOAN%'
and firstname like '%ROLANDO%'
Insert into #temptable
Select CaseNo from tblcrew
where Lastname like '%ROSAS%'
and firstname like '%FRANCASIO%'
我想重复我的查询,直到关键字表中的所有行都被搜索并将每个查询的结果保存到临时表中。是否有可能在不键入关键字列中的所有值的情况下执行此操作。
请有人帮帮我..谢谢!
答案 0 :(得分:0)
您只需将两张表连接在一起,而无需键入任何值。
Insert into #temptable
Select c.CaseNo
from tblcrew c
inner join tblKeyword k
on c.Lastname like '%'+k.Lastname+'%'
and c.firstname like '%'+k.firstname +'%'
答案 1 :(得分:0)
通常从Adventure Works数据库开始,例如这样的示例。我将谈论利用索引搜索的精确匹配,利用索引扫描的完全匹配,以及全文索引,您可以在其中进行不完全匹配,从而产生搜索。
Person.Person表包含您的示例的姓氏和名字。我只保留业务ID的主键并在(last,first)创建一个索引。
--
-- Just PK & One index for test
--
-- Sample database
use [AdventureWorks2012];
go
-- add the index
CREATE NONCLUSTERED INDEX [IX_Person_LastName_FirstName] ON [Person].[Person]
(
[LastName] ASC,
[FirstName] ASC
);
go
使用外卡进行不精确匹配。只运行文本以完全匹配。我从Person.Person表中随机选择了两个名字。
--
-- Run for match type
--
-- Sample database
use [AdventureWorks2012];
go
-- remove temp table
drop table #inquiry;
go
-- A table with first, last name combos to search
create table #inquiry
(
first_name varchar(50),
last_name varchar(50)
);
go
-- Add two person.person names
insert into #inquiry values
('%Cristian%', '%Petculescu%'),
('%John%', '%Kane%');
/*
('Cristian', 'Petculescu'),
('John', 'Kane');
*/
go
-- Show search values
select * from #inquiry;
go
检查运行时的下一步是清除过程高速缓存和内存缓冲区。您不希望现有计划或数据扭曲数字。
-- Remove clean buffers & clear plan cache
CHECKPOINT
DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE
GO
-- Show time & i/o
SET STATISTICS TIME ON
SET STATISTICS IO ON
GO
第一个SQL语句将在临时搜索值表和Person.Person之间进行内部连接。
-- Exact match
select *
from
[Person].[Person] p join #inquiry i
on p.FirstName = i.first_name and p.LastName = i.last_name
统计数据和运行时间。
表'人物'扫描计数2,逻辑读取16,物理读取8,CPU时间= 0 ms,已用时间= 29 ms。
生成的查询计划对#inquiry表执行表扫描,并对最后一个名称执行索引索引查找。这是一个很好的简单计划。
让我们使用通配符和LIKE运算符进行不精确的匹配重试。
-- In-Exact match
select *
from
[Person].[Person] p join #inquiry i
on p.FirstName like i.first_name and p.LastName like i.last_name
统计数据和运行时间。
表'人物'扫描计数2,逻辑读取219,CPU时间= 32 ms,经过时间= 58 ms。
生成的查询计划要复杂得多。我们仍在对#inquiry进行表扫描,因为它没有索引。但是,有很多嵌套连接使用索引进行公正匹配。
我们在查询中添加了三个运算符,执行时间是完全匹配的两倍。
简而言之,如果你使用LIKE命令进行不精确的匹配,它们将会更加昂贵。
如果您要搜索数十万条记录,请使用FULL TEXT INDEX(FTI)。我写了两篇关于这个主题的文章。
http://craftydba.com/?p=1421 http://craftydba.com/?p=1629
每天晚上,您都必须拥有一个可以通过任何更改来更新FTI的流程。在点击之后,您可以使用CONTAINS()运算符来模糊匹配中的索引。
我希望我解释了这些差异。我已经看到关于这个主题的持续混淆,我想在Stack Overflow上提出一些我可以参考的内容。
祝你好运Juan。