2010-08-10 98 views
2

我在比較SQL Server中的兩個表時遇到問題。SQL Server:如何比較兩個表

我有我的第一個表[Table1]與我的內容存儲的文本列,第二個表[table2]與我的關鍵字列。

現在我想比較我的所有關鍵字與我的內容,並獲取關鍵字列表和內容中出現的次數。 (足夠明確了嗎?)

+2

啓用全文搜索? – 2010-08-10 10:05:42

+1

首先 - 如果您使用的是SQL Server 2005或更高版本 - 刪除TEXT列並使用VARCHAR(MAX)(或NVARCHAR(MAX))。 – 2010-08-10 11:33:06

+0

關鍵字存儲在NAVCHAR(255)列中,但ntext和我的內容無法更改。 我只會運行一次查詢 - 需要這些數據給我們的SEO人。 – giker 2010-08-10 11:43:15

回答

0

這將返回您在ntext字段中存在的來自Table2(kwd nvarchar(255))的關鍵板的來自Table1(id int,txt ntext)的ID列表。發生的次數很棘手,您將不得不編寫UDF,最好使用CLR來獲取它。

我將詞定義爲由空格分隔的所有內容,或者從左和空格中打開括號,從右邊關閉parenhesize,逗號,點或分號。您可以添加更多條件,例如引號,雙引號等。

Select Table1.id, Table2.kwd 
    From Table1 
Cross Join Table2 
Where patindex(N'%[ (]'+Table2.kwd+N'[ ,.;)]%',N' '+cast(Table1.txt as nvarchar(max))+N' ')>0 
Order by id, kwd 
+0

以及如何獲取每個關鍵字的出現次數? – 2010-08-10 13:04:38

+0

這是查殺我的數據庫 - 對於前10名執行時間達到9分鐘:) 您寫道:「我定義的單詞是由空格分隔的所有內容或從左側和空格開放的括號」 但是,每個關鍵字都是一行表2 – giker 2010-08-10 14:16:08

+0

這是一個重要的查詢,因爲它必須在關鍵字和文本表之間進行交叉連接,並且必須執行不是速度冠軍的patindex函數。當我說「我將詞語定義爲...」時,我的意思是如何在您的ntext字段中定義單詞,因爲我不知道單詞是否由空格分隔,逗號分隔,製表符分隔或由印刷文本中單詞的常規含義可以有分隔符的組合。無論如何,如果你有Martin Smith提出的SQL 2008使用解決方案(見下文),雖然它也需要很多資源。 – Niikola 2010-08-10 16:23:38

2

什麼版本的SQL Server?如果SQL2008你可以(可能從文本鑄造nvarchar(max)後)

WITH Table1 AS 
(
SELECT 1 AS Id, N'how now brown cow' AS txt UNION ALL 
SELECT 2, N'she sells sea shells upon the sea shore' UNION ALL 
SELECT 3, N'red lorry yellow lorry' UNION ALL 
SELECT 4, N'the quick brown fox jumped over the lazy dog' 
), 
Table2 AS 
(
SELECT 'lorry' as keyword UNION ALL 
SELECT 'yellow' as keyword UNION ALL 
SELECT 'brown' as keyword 
) 

SELECT Table1.id,display_term, COUNT(*) As Cnt 
FROM Table1 
CROSS APPLY sys.dm_fts_parser('"' + REPLACE(txt,'"','""') + '"', 1033, 0,0) 
JOIN Table2 t2 ON t2.keyword=display_term 
WHERE TXT IS NOT NULL 
GROUP BY Table1.id,display_term 
ORDER BY Cnt DESC 

返回做

id   display_term     Cnt 
----------- ------------------------------ ----------- 
3   lorry       2 
3   yellow       1 
4   brown       1 
1   brown       1 
+0

哇,我錯過了sys.dm_fts_parser函數,它很棒 – Niikola 2010-08-10 16:19:08

+0

謝謝你,但我無法運行它。 我得到: 「參數數據類型ntext對替換函數的參數1無效。」 – giker 2010-08-11 10:46:44

+0

將'cast(YourColumnName as nvarchar(max))'傳遞給替換函數 – 2010-08-11 10:49:50