Это скорее проблема синтаксиса. Как вы угадаете намерение пользователя с помощью всего одного поля ввода?
- Они ищут "Джона Гамбурга" человека?
- Они ищут "улицу Джона Гамбурга"?
- Они ищут "Джона", который живет на "Гамбург-стрит" в Спрингфилде?
- Они ищут "Джона", который живет в городе "Гамбург"?
Не зная намерений пользователя, лучшее, на что вы можете надеяться, - это ИЛИ условия и получение попаданий с самым высоким рейтингом.
В противном случае вам нужно запрограммировать тонну логики, в зависимости от количества слов, переданных в:
2 слова:
Поиск данных сотрудника для термина 1, Поиск данных сотрудника для термина 2, Поиск данных адреса для термина 1, Поиск данных адреса для термина 2. Слияние результатов по термину, порядок по большинству обращений.
3 слова:
Поиск данных сотрудника для термина 1, Поиск данных сотрудника для термина 2, Поиск данных сотрудника для термина 3, Поиск данных адреса для термина 1, Поиск данных адреса для термина 2, Поиск данных адреса для термина 3. Объединение результатов по термину, порядок по большинству хитов.
и т.д ...
Полагаю, я бы перепроектировал графический интерфейс, чтобы разделить ввод как минимум на Имя и Адрес. Если это невозможно, примените правило синтаксиса: «Первые слова будут считаться именем до появления запятой, любые слова после этого будут считаться адресами»
EDIT:
Ваша лучшая ставка по-прежнему - ИЛИ условия, и берите хиты с самым высоким рейтингом. Вот пример этого и пример, почему это не идеально без какой-либо предварительной обработки ввода для определения намерений пользователя:
insert into Employee (id, [name]) values (1, 'John Hamburg')
insert into Employee (id, [name]) values (2, 'John Smith')
insert into Employee (id, [name]) values (3, 'Bob Hamburg')
insert into Employee (id, [name]) values (4, 'Bob Smith')
insert into Employee (id, [name]) values (5, 'John Doe')
insert into Address (id, street, city, employeeid) values (1, 'Main St.', 'Springville', 1)
insert into Address (id, street, city, employeeid) values (2, 'Hamburg St.', 'Springville', 2)
insert into Address (id, street, city, employeeid) values (3, 'St. John Ave.', 'Springville', 3)
insert into Address (id, street, city, employeeid) values (4, '5th Ave.', 'Hamburg', 4)
insert into Address (id, street, city, employeeid) values (5, 'Oak Lane', 'Hamburg', 5)
Теперь, поскольку мы не знаем, какие ключевые слова будут применяться к какой таблице, мы должны предположить, что они могут применяться к любой из этих таблиц, поэтому нам нужно ИЛИ условия для каждой таблицы, ОБЪЕДИНИТЬ результаты, агрегировать их и вычислить высший ранг.
SELECT Id, [Name], Street, City, SUM([Rank])
FROM
(
SELECT emp.Id, [Name], Street, City, [Rank]
FROM Employee emp
JOIN [Address] addr ON emp.Id = addr.EmployeeId
JOIN CONTAINSTABLE(Employee, *, 'JOHN OR Hamburg') AS keyTblEmp ON emp.Id = keyTblEmp.[KEY]
UNION ALL
SELECT emp.Id, [Name], Street, City, [Rank]
FROM Employee emp
JOIN [Address] addr ON emp.Id = addr.EmployeeId
JOIN CONTAINSTABLE([Address], *, 'JOHN OR Hamburg') AS keyTblAdd ON addr.Id = keyTblAdd.[KEY]
) as tmp
GROUP BY Id, [Name], Street, City
ORDER BY SUM([Rank]) DESC
Это не идеально, вот что вы получите для примера (в вашем случае вы бы хотели, чтобы Джон Доу из Гамбурга появился первым):
Id Name Street City Rank
2 John Smith Hamburg St. Springville 112
3 Bob Hamburg St. John Ave. Springville 112
5 John Doe Oak Lane Hamburg 96
1 John Hamburg Main St. Springville 48
4 Bob Smith 5th Ave. Hamburg 48
Но это лучшее, что вы можете сделать, не анализируя входные данные, прежде чем отправлять их в SQL, чтобы сделать "наилучшее предположение" о том, что хочет пользователь.