【发布时间】:2010-10-29 12:07:00
【问题描述】:
我已经以表格形式提供了几个表格
主记录
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
我希望能够构建一个搜索词,以便可以在地名上输入全部或部分词。例如。如果我输入 'Oxford' 我会得到所有 3 条记录,如果我输入 'Oxford' 和 'Giles' 我只会得到记录 1 - 几乎就像使用 WHERE IN ('Oxford','Giles') 但条款是 ANDed 而不是被ORed?
不知道能不能做到这一点?我试过各种子查询都没有成功
我使用的是 SQL Server 2008
我想避免创建全文搜索字段
任何清除迷雾的指针都会非常有帮助。
* 更新主记录详细信息以避免混淆 *
两个表之间的唯一联系是记录 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
Samuel 等等
我的问题是当我在名字搜索字段中有超过 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')
这不返回任何内容。
我只需要返回包含 Samuel 和 William 的主记录,即。当搜索词中包含多个名称时。
它还需要找到威廉塞缪尔以及塞缪尔威廉。
从其他人的帖子中,我走上了 DIVISION 的路线并提出了以下内容(在 main SELECT 之前放置了一些字符串操作):
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 ('''+@Forename +''') ' +
' 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”——非常有帮助
【问题讨论】:
-
只是出于好奇:为什么要通过各种方式避免全文搜索??
-
当然不是绝对 - 我们将在最初的紧迫性结束后查看它。
-
请注意,这个地方实际上叫做 St Aldate's (en.wikipedia.org/wiki/St_Aldate's,_Oxford) ;)
-
学究警告! - 但不是根据 1736 年去世的艾萨克培根的遗嘱 :-)
标签: sql sql-server-2008 search subquery