możesz użyć połączenia, aby wymagać dopasowania zarówno adresu, jak i nazwiska osoby.
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
co moim zdaniem dałoby określone przez Ciebie wyniki, ale oczywiście wymaga to zarówno nazwy, jak i hasła wyszukiwania adresu, aby wyszukiwanie zwróciło jakiekolwiek wyniki. Nie określiłeś, co się stanie, jeśli ktoś po prostu wyszuka „Jan”, jeśli zawsze otrzymasz zarówno imię, jak i adres, myślę, że powyższe zadziała dobrze.