在哪里问题

Rog*_*ard 2 sql search subquery sql-server-2008

我已经在表单中提供了几个表

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...  
Run Code Online (Sandbox Code Playgroud)

和支持表

地名

Record ID   PlaceName
    1        Oxford  
    1        St  
    1        Giles  
    2        Oxford  
    3        Oxford  
    3        St  
    3        Aldate  
Run Code Online (Sandbox Code Playgroud)

我希望能够建立一个搜索词,以便我可以输入地名的全部或部分术语.例如,如果我输入'Oxford',我会得到所有3条记录,如果我输入'Oxford'和'Giles'我只获得记录1 - 几乎就像使用WHERE IN('Oxford','Giles')但条款是ANDed而不是是ORed?

我不知道我能不能做到这一点?我尝试了各种子查询但没有成功

我正在使用SQL Server 2008

我想避免创建全文搜索字段

任何清除雾气的指针都会非常有帮助.

*更新主记录详细信息以避免混淆*
2个表之间的唯一链接是记录ID

**更新了**03年03月的样本表

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');  
Run Code Online (Sandbox Code Playgroud)

我的初步查询是

SELECT main.[RecordID],main.documentRef  
    FROM [MAIN_RECORD] main  
    INNER JOIN  [FORENAMES] fn  
    ON main.RecordID = fn.RecordID  
    WHERE fn.ForeName IN ('William')  
Run Code Online (Sandbox Code Playgroud)

这很好,并返回

RecordID    documentRef  
86  Doc Referring to William Samuel ADAMS  
87  Doc Referring to William JONES  
Run Code Online (Sandbox Code Playgroud)

与塞缪尔等同上

我的问题是当我在名字搜索字段中有多个条目时,即

SELECT main.[RecordID],main.documentRef  
    FROM [MAIN_RECORD] main  
    INNER JOIN  [FORENAMES] fn  
    ON main.RecordID = fn.RecordID  
    WHERE fn.ForeName IN ('William,Samuel') 
Run Code Online (Sandbox Code Playgroud)

这什么都不返回.

我需要这个只返回同时包含塞缪尔和威廉的MAIN记录,即.当搜索词中包含多个名称时.
它还需要找到威廉塞缪尔和塞缪尔威廉.

从其他人的帖子中,我走了DIVISION的路线并提出以下内容(在主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
Run Code Online (Sandbox Code Playgroud)

这似乎给了我正在寻找的东西.

非常感谢所有人特别为'Quassnoi'和'onedaywhen'做出贡献 - 非常有帮助

Qua*_*noi 5

SELECT  *
FROM    mainrecord mr
WHERE   (
        SELECT  COUNT(*)
        FROM    placenames pn
        WHERE   pn.record = mr.record
                AND pn.placename IN ('Oxford', 'St', 'Giles')
        ) = 3
Run Code Online (Sandbox Code Playgroud)