2012-04-27 144 views
0

我已經創建嵌套遊標基本上比較一個表的另一個列值的列值,並返回最接近的匹配。替代SQL嵌套遊標

表的內容被說:

(的ColumnName和值如下) 表A

**Names** 
MandarinOrange 
SweetApple 
SourApple 
AppleThatTasteslikeGrapes 

表B

**Names** 
PlainOrange 
SourOrange 
Grapple 
. 
. 
. 

所以光標1(外光標)取各並且與表2中的所有名稱進行比較並返回最接近的匹配。光標2(內部)用於檢索表2中的名稱

我想看看,如果有acheive使用遊標 (因爲實在是太慢了)

+1

編輯您的問題,包括你的代碼。 – 2012-04-27 16:42:41

+0

你能否詳細說明你如何確定「最接近的匹配」?它是一個專有的溶液或者是它的一些基本邏輯被包括在從表A - 用於例如以名稱名稱的TableB中的值:'其中tableA_value LIKE「%」 + tableB_value +「%」' – 2012-04-27 17:01:54

回答

0

避免光標始終是一個更好的做法,並在你的情況,我認爲這是可以實現的相同avaoiding方式。關鍵在於您爲了評估比較結果而執行的計算。

一種解決方案是創建一個函數有兩個字符串並返回一個1/0值作爲比較結果。然後你可以調用該函數作爲SELECT語句的一部分並保存遊標迭代。

下面是這樣一個函數的一個例子:

CREATE FUNCTION fn_Compare 
(
    @firstValue  varchar(50), 
    @secondValue varchar(50) 
) 
RETURNS bit 
AS 
BEGIN 
    DECLARE @Result bit 
    SET @Result = 0 --False by default 

    --!Here goes your specific logic for comparing string! 
    IF @firstValue = @secondValue 
     SET @Result = 1 

    RETURN @Result 

END 
GO 

--Use it in a sentance 
SELECT dbo.fn_Compare('TEST', 'TEST') AS Match --True 
SELECT dbo.fn_Compare('TEST', 'TEST2') AS Match --False 

--Use it in a query 
SELECT 
    name, 
    name, 
    dbo.fn_Compare(name, name) AS Match 
FROM sysobjects 
WHERE 
    Type = 'u' 

--Cleanup 
DROP FUNCTION fn_Compare 

我希望這有助於。