2014-10-03 41 views
-2

美好的一天夥計們,你能幫我解決我的SQL查詢問題嗎?我有在網絡上的項目我打電話查詢好東西是我可以存儲什麼數據正在搜索我的項目,他們進入我的查詢搜索框的日誌文件。SQL在不同表中的一列中選擇語句循環

這是關鍵字的表格中還搜查詢問:

enter image description here

此代碼:

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

你沒有在所有的「循環」 – 2014-10-03 02:05:17

+0

你的問題是不明確的解釋。 – 2014-10-03 02:09:42

回答

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 +'%' 
+0

但我在tblkeyword中有100行。有沒有機會輸入所有500個不同的值? – 2014-10-03 03:08:50

+0

看看查詢 - 你不需要輸入任何值 – 2014-10-03 03:11:33

+0

類似的會導致生成次優計劃。最糟糕的情況是索引掃描,最好的情況是使用提取嵌套循環的索引查找,請參閱下面的分析。 – 2014-10-03 04:07:23

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毫秒,經過時間= 29毫秒。

生成的查詢計劃執行#inquiry表的表掃描以及對最後名字和名字索引的索引查找。這是一個很好的簡單計劃。

enter image description here

讓使用通配符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毫秒,經過時間= 58毫秒。

生成的查詢計劃是一種複雜得多。由於沒有索引,我們仍在對#查詢進行表格掃描。但是,有很多嵌套連接繼續使用索引進行公平匹配。

我們增加了三個運營商查詢和執行時間的兩倍完全匹配的。

enter image description here

總之,如果你正在做與LIKE命令不精確的比賽中,他們會更昂貴。

如果您正在尋找成千上萬的記錄,使用全文索引(FTI)。我寫了兩篇關於這個話題的文章。

​​ http://craftydba.com/?p=1629

每天晚上,你必須有一個過程,有任何的更改來更新FTI。在這一擊之後,您可以使用CONTAINS()運算符來利用模糊匹配中的索引。

我希望我解釋的差異。我已經看到了這個話題持續的困惑,我想在Stack Overflow上寫一些我可以參考的東西。

祝您好運娟。