У меня есть пара таблиц в форме
.
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...
и опорный стол
PlaceNames
Record ID PlaceName
1 Oxford
1 St
1 Giles
2 Oxford
3 Oxford
3 St
3 Aldate
Я хочу иметь возможность составить поисковый запрос, чтобы я мог вводить все или частичные термины в географических названиях. Например. если я введу «Оксфорд», я получу все 3 записи, если я введу «Оксфорд» и «Джайлз», я получу только запись 1 - почти как при использовании WHERE IN («Оксфорд», «Джайлз»), но вместо «AND» вместо «AND» быть ORed?
Я не знаю, смогу ли я достичь этого? Я пробовал различные подзапросы без успеха
Я использую SQL Server 2008
Я хотел бы избежать создания полнотекстового поиска
Любые указатели для очистки тумана были бы очень полезны.
* Обновлена основная запись, чтобы избежать путаницы *
Единственная связь между двумя таблицами - это идентификатор записи
** Обновлено ** 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')
Это ничего не возвращает.
Мне это нужно, чтобы ТОЛЬКО вернуть ОСНОВНУЮ запись, в которой есть ОБА Сэмюэль И Уильям, т.е. когда поисковый термин содержит более одного имени.
Также нужно найти Уильяма Сэмюэля, а также Сэмюэля Уильяма.
Из сообщений других, я пошел по пути 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
Это, кажется, дает мне то, что я ищу.
Большое спасибо всем за помощь, особенно 'Quassnoi' и 'onedaywhen' - очень помогли