2011-10-28 19 views
3

我想爲Stack Exchange自己的Data Explorer寫一個查詢。此查詢將創建一個臨時表,其中包含一個拼寫錯誤的單詞列表以及其正確拼寫,然後搜索帖子以查找它們。如何編寫一個SQL查詢從另一個表中搜索一組單詞?

這裏是我到目前爲止(減去註釋):

DECLARE @SpellingMistakes TABLE (wrong VARCHAR(255), right VARCHAR(255)) 

INSERT INTO @SpellingMistakes (wrong, right) 
VALUES ('ubunut', 'ubuntu') 

SELECT Id as [Post Link] 
FROM Posts 
WHERE 
    ... 

這就是我卡住 - 的WHERE子句。我需要某種方式說「如果Posts.Body包含任何@SpellingMistakes.wrong」。不過,我不知道該怎麼做。

注意:數據資源管理器使用Microsoft SQL Server 2008 R2。

+1

一個糟糕的辦法是'Posts.Body像+ '%' +(從SpellingMistakes選擇SpellingMistakes.wrong)+ '%'' - 這種東西 - 不知道這是否是正確的語法 – Sathya

+0

可悲的是'不能在表或索引視圖'Posts'中使用CONTAINS或FREETEXT謂詞,因爲它沒有全文索引。' –

+0

我認爲數據資源管理器使用Azure,而不是像2008 R2那樣功能完備。 SO的後端是SQL Server ... –

回答

2

我不知道MS SQL,但大多數SQL實現都有一個'LIKE'等價物。所以在這種情況下,你可以加入這兩個表並在JOIN條件下使用LIKE。

SELECT Id as link 
FROM Posts P JOIN SpellingMistakes S 
ON P.Body LIKE '%'+S.wrong+'%' 

編輯:假設Posts是一個大表(和SpellingMistakes不能太小要麼),這將需要大量的資源。解決這個問題的一種方法是將表Posts分成更小的子集並構建多個語句。

SELECT Id as link 
FROM (SELECT * FROM Posts WHERE Id<=10000) P 
JOIN 
SpellingMistakes S 
ON P.Body LIKE '%'+S.wrong+'%' 

SELECT Id as link 
FROM (SELECT * FROM Posts WHERE Id<=20000 and Id>10000) P 
JOIN  
SpellingMistakes S 
ON P.Body LIKE '%'+S.wrong+'%' 

依此類推。

+0

我做了類似於並且服務器ch咽聲稱(在錯誤消息中)它「耗盡了資源」。我可以確定這個查詢不會使用大量的資源嗎? –

+0

@GeorgeEdison加入2張大表總是會佔用大量資源['O(nm)']。我現在想不出任何其他解決方案。我通常做大表連接的方式是將連接分解成多個語句,每個語句使用較大表的較小子集。因此,在這種情況下,如果您可以在表'Posts'中指定一個條件來僅提取一個子集,那麼'JOIN'應該能夠使用較少的資源。 – Ritesh

0
SELECT Id as PostLink 
FROM Posts p 
WHERE 
EXISTS 
    (
     SELECT * 
     FROM @SpellingMistakes 
     WHERE p.Body LIKE '%' + wrong + '%' 
    ) 
相關問題