我有一對夫婦的形式已經提供的表的凡有關
MainRecord
Record ID Details Textual Information
1 AAAAAAA ... some text referring to Oxford St Giles...
2 BBBBBBB ... some text referring Oxford....
3 CCCCCCC ... some text referring to Oxford St Aldate...
和支撐臺
地名
Record ID PlaceName
1 Oxford
1 St
1 Giles
2 Oxford
3 Oxford
3 St
3 Aldate
我はnt能夠建立一個搜索詞,這樣如果我可以輸入地名的全部或部分條款。例如。如果我輸入'牛津',我會得到所有3條記錄,如果我輸入'Oxford'和'Giles',我只會得到第一條記錄 - 就像使用WHERE IN('Oxford','Giles')但條款是AND ORed?
我不知道我能否做到這一點?我曾嘗試過各種子查詢沒有成功
我使用SQL Server 2008
我想避免一個全文檢索領域
任何指針以清除霧氣將是非常有益的。
*主要記錄詳細信息更新,以避免混淆*
2個表之間的唯一聯繫是記錄ID
** **更新11月3用示例表
CREATE TABLE MAIN_RECORD (RecordID int,DocumentRef varchar(100));
INSERT INTO MAIN_RECORD VALUES (86, 'Doc Referring to William Samuel ADAMS');
INSERT INTO MAIN_RECORD VALUES (87, 'Doc Referring to William JONES');
INSERT INTO MAIN_RECORD VALUES (88, 'Doc Referring to Samuel SMITH');
CREATE TABLE FORENAMES (RecordID int,Forename varchar(25));
INSERT INTO FORENAMES VALUES (86, 'William');
INSERT INTO FORENAMES VALUES (86, 'Samuel');
INSERT INTO FORENAMES VALUES (87, 'William');
INSERT INTO FORENAMES VALUES (88, 'Samuel');
我初始查詢是
SELECT main.[RecordID],main.documentRef
FROM [MAIN_RECORD] main
INNER JOIN [FORENAMES] fn
ON main.RecordID = fn.RecordID
WHERE fn.ForeName IN ('William')
這很好,並且返回
RecordID documentRef
86 Doc Referring to William Samuel ADAMS
87 Doc Referring to William JONES
同上塞繆爾等
我的問題是,當我在錄名字搜索領域超過1項即
SELECT main.[RecordID],main.documentRef
FROM [MAIN_RECORD] main
INNER JOIN [FORENAMES] fn
ON main.RecordID = fn.RecordID
WHERE fn.ForeName IN ('William,Samuel')
這將返回什麼。
我需要這個只返回主記錄,它有塞繆爾和威廉在它,即。當搜索詞有多個名稱時。
它還需要找到威廉塞繆爾以及塞繆爾威廉。
從別人的帖子,我已經下降司的途徑,並提出如下(將主要選擇之前的一些字符串操作):
DECLARE @Forename nvarchar(max)
DECLARE @SQLCommand nvarchar(max)
DECLARE @Number_of_Terms int
SET @Forename = 'William,Samuel'
--SET @Forename = 'Samuel,William'
--SET @Forename = 'William'
--SET @Forename = 'Samuel'
SET @Number_of_Terms = LEN(@Forename) - LEN(REPLACE(@Forename,',',''))+1
SET @Forename = REPLACE(@Forename,',',''',''')
SET @SQLCommand = 'SELECT fr.RecordID FROM dbo.BRS109_FullRecord fr '+
'INNER JOIN dbo.BRS109_Forenames fn '+
'ON fr.RecordID = fn.RecordID '+
'WHERE fr.RecordID = fn.RecordID '+
'AND fn.forename IN ('''[email protected] +''') ' +
' GROUP BY fr.RecordID ' +
' HAVING COUNT(fr.RecordId) = ' + CAST(@Number_of_Terms AS varchar(2)) +
' ORDER BY fr.RecordId'
EXECUTE sp_executesql @SQLCommand
這似乎給我我所期待的。
非常感謝所有爲特別貢獻「Quassnoi」和「onedaywhen」 - 非常有幫助
只是出於好奇:你爲什麼要避免全文搜索? – 2010-10-29 12:14:57
當然不是用一切手段 - 它的東西,我們將着眼於後INTIAL緊迫性已經結束。 – 2010-10-29 12:23:07
注意,有問題的地方實際上是所謂阿爾達特街(http://en.wikipedia.org/wiki/St_Aldate's,_Oxford);) – onedaywhen 2010-10-29 13:51:34