2009-12-08 86 views
0

我正在運行SQL Server 2008,並試圖針對某些存儲不佳的數據運行一些查詢,我寧願不通過並嘗試清理(數百萬行要處理用)。我所擁有的是一個日誌表,一個表中有一些FK數據作爲逗號分隔的字符串,另一個表中有一個整數PK。我希望能夠將FK的整數列表連接到主表中正確的PK整數。我的查詢是這樣的:將INT列加入以逗號分隔的INT列表

SELECT 
    L.* 
FROM MyLogs L (NOLOCK) 
    INNER JOIN Details D (NOLOCK) ON L.SearchValue = D.ID 

在上面的查詢,L.SearchValue包含「123,456,7890」,而D.ID是一個整數主鍵。有什麼方法可以以任何有效的方式將它們連接在一起,還是應該接受我的命運,並開始編寫一個腳本來將所有這些逗號分隔的值分解成單獨的行?

+0

感謝所有的答案,它幾乎完全符合我的預期(儘管我討厭承認它)。我會處理那個清理腳本,然後穿過我的手指。我最終可能會使用Stu建議的腳本來完成轉換。祝我好運:) – 2009-12-08 16:37:47

回答

0

非常非常非常糟糕的設計,這將是性能比較很差,但你可以使用CHARINDEX函數

Select L.*FROM MyLogs L (NOLOCK)  
    Join Details D (NOLOCK) 
     On CharIndex(Cast(D.ID as varChar(6)), L.SearchValue) > 0 

,這將prodcude一些虛假加入12將在1934,312,455' 。爲了消除這些連接你必須讓查詢變得更加複雜,通過包括分隔符

Select L.*FROM MyLogs L (NOLOCK)  
    Join Details D (NOLOCK) 
     On CharIndex(Cast(', ' + D.ID as varChar(6)) + ',', 
          ', ' + L.SearchValue + ',') > 0 

...但我建議你開始一個腳本工作,打破所有的這些逗號分隔值在不同的行。

+0

不是。假設D.ID是1,L.SearchValue是「34199」? – Stu 2009-12-08 16:28:30

+0

@Stu,你在編輯之間發現了我...... – 2009-12-08 16:33:04

0

打破這種可怕的存儲數據的腳本最終會比編寫試圖加入這些值的hacky SQL查詢更有效。我不確定一個連接是否是即將到來的。也許某種形式的子查詢的工作會更好,因爲計劃A.

0

試試這個:

SELECT L.* 
FROM MyLogs L (NOLOCK) 
    INNER JOIN Details D (NOLOCK) ON CONTAINS(',' + L.SearchValue + ',', ',' + Convert(varchar,D.ID) + ',') 

這將是可怕的ineffecient,但不像丹尼爾斯回答它不會打破,如果讓我們說SearchValue包含(123234345)和D.ID是23(這將是2行真)

添加逗號修復。

相關問題