Один из способов сделать это - использовать Cross Apply в SQL 2005 или более поздней версии.
SELECT
TOP (5000) Users.Login,
Users.Phone,
GeoPhone.Region,
LEN(GeoPhone.Mask) AS MaskLen
FROM Users
CROSS APPLY
(
SELECT TOP 1 Region,Mask
FROM geophone
WHERE LEFT (users.phone, Len(geophone.mask)) = geophone.mask
ORDER BY
Len(geophone.mask) DESC
) geophone
Обратите внимание, что он возвращает только одну запись из геофона.Если в geophone.mask есть две записи, привязанные к длине маски, вы не сможете определить, какую запись она вернет
Вот решение, использующее MAX () и его реально переносимое
SELECT TOP (5000) users.LOGIN,
users.phone,
geophone.region,
Len(geophone.mask) AS masklen
FROM users
INNER JOIN geophone
ON LEFT(users.phone, Len(geophone.mask)) = geophone.mask
INNER JOIN (SELECT MAX(Len(geophone.mask)) maxlength,
users.phone
FROM users
INNER JOIN geophone
ON LEFT(users.phone, Len(geophone.mask)) =
geophone.mask
GROUP BY users.phone) t
ON t.phone = users.phone
AND t.maxlength = Len(geophone.mask)
Однако, если две строки в геофоне связаны с самой длинной длиной, будут возвращены оба результата.Я не знаю, лучше это или хуже для тебя.
Вы также можете использовать ROW_NUMBER в SQL 2005 или более поздней версии