Sie könnten einen Join verwenden, um eine Übereinstimmung sowohl in der Adresse als auch im Namen der Person zu verlangen.
SELECT
(keyTblSp.RANK * 3) AS [Rank],
sp.*
FROM Employee sp
INNER JOIN
CONTAINSTABLE(Employee, *, 'John OR Hamburg', 1000) AS keyTblSp
ON sp.EmployeeId = keyTblSp.[KEY]
join
(
SELECT
(keyTbl.RANK * 2) AS [Rank],
sp.*
FROM Employee sp
LEFT OUTER JOIN [Address] addr ON addr.EmployeeId = sp.EmployeeId
INNER JOIN
CONTAINSTABLE([Address], *, 'John OR Hamburg', 1000) AS keyTbl
ON addr.AddressId = keyTbl.[KEY]
UNION ALL
SELECT
(keyTbl.RANK * 2) AS [Rank],
sp.*
FROM Employee sp
LEFT OUTER JOIN [Address] addr ON addr.EmployeeId = sp.EmployeeId
LEFT OUTER JOIN [City] cty ON cty.CityId = addr.CityId
INNER JOIN
CONTAINSTABLE([City], *, 'John OR Hamburg', 1000) AS keyTbl
ON cty.CityId = keyTbl.[KEY]
) addr_matches
on addr_matches.EmployeeId = sp.EmployeeId
was Ihnen meiner Meinung nach die von Ihnen angegebenen Ergebnisse liefern würde. Dies erfordert jedoch offensichtlich sowohl einen Namen als auch einen Adresssuchbegriff, damit eine Suche Ergebnisse zurückgibt. Sie haben nicht angegeben, was passiert, wenn jemand nur nach „John“ sucht, wenn Sie immer sowohl einen Namen als auch eine Adresse erhalten, wird das oben genannte gut funktionieren, denke ich.