我正在使用這個連接從tblChassis中檢索記錄,其中temp.ChassisNumber與ch.ChassisNumber
雖然這可以作業,但它很慢。
它慢的原因是像'%'
select ...
from @TempTable temp
left join tblChassis ch on ch. ChassisNumber like '%' temp.ChassisNumber '%' >。
我必須使用like,因為有時我沒有得到完整的值來搜索。
這種情況是這樣的,用戶將一個底盤編號的串列放在一個表格上,然后表格去尋找表格中的底盤編號。 有時會有完整的底盤號碼(長度=17),但有時他們沒有,他們只有一部分。這部分可能是最后的XX位數字,或前XX位數字,或中間的一些數字。
當然,有時他們會有一個混合。
所以我所做的是建立一個臨時表 declare @TempTable (ChassisNumber varchar(17))并且我將用戶在表格中丟棄的所有底盤號碼填入其中。
然后我可以從這個表中進行選擇,并與我需要的所有其他表進行連接。
declare @TempTable table(ChassisNumber varchar(17)
insert into @TempTable
values('WF0EXXTTREMG4210')。
('WF0JXXWPCHMB28874') 。
('WF0JXXWPCHMB')。
('MB28874')
select ...
from @TempTable temp
left join tblChassis ch on ch. ChassisNumber like '%' temp.ChassisNumber '%' >。
所以現在我想讓查詢執行得更快一些,我想知道是否有辦法讓連接變成動態的,所以當底盤號碼不是17位時,我可以使用like,而當底盤號碼有17位時,使用=。
當連接是ch.ChassisNumber = temp.ChassisNumber時,查詢是如此之快,我甚至無法測量它。
這樣的事情可能嗎?
例如,這個偽代碼(當然不能作業,但要給出我正在尋找的想法)
on case
when len(temp.ChassisNumber) = 17
then ch.ChassisNumber = temp.ChassisNumber
else ch.ChassisNumber like '%'/span> temp. ChassisNumber '%'_span>
end
編輯部
我想我可以首先連接所有有17位底盤號碼的temptable記錄,然后union與所有其他記錄的查詢。
這將有所幫助,但我希望有更好的辦法。
uj5u.com熱心網友回復:
我認為Stu在那里說的comment有一些依據,然而,我想在此基礎上再加一點。雖然這是一個表格變數,但我建議在上述表格中添加一個計算列,然后你可以像下面這樣做一些過濾。這意味著,如果表中的所有行的長度為17,那么底部的查詢應該被 "掩蓋",因為WHERE將過濾掉變數中的所有行:
DECLARE @TableVariable table (ChassisNumber varchar(17) 。
ChassisNumberLen AS LEN(ChassisNumber) PERSISTED)。
INSERT INTO @TableVariable (ChassisNumber)
VALUES ('WF0EXXTTREMG4210')。
('WF0JXXWPCHMB28874')。
('WF0JXXWPCHMB')。
('MB28874')。
SELECT *
FROM @TableVariable;
SELECT {YourColumns}.
FROM @TableVariable TV
LEFT JOIN dbo.tblChassis CH ON TV.ChassisNumber = CH.ChassisNumber
WHERE TV.ChassisNumberLen = 17
UNION ALL
SELECT {YourColumns}.
FROM @TableVariable TV
LEFT JOIN dbo.tblChassis CH ON CH. ChassisNumber LIKE '%'/span> TV.ChassisNumber '%'/span>
WHERE TV.ChassisNumberLen < 17; --我認為它們不能長于17。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/307257.html
標籤:
