我有一对夫妇的形式已经提供的表的凡有关
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