#sql #sql-server #azure-sql-database
#sql #sql-сервер #azure-sql-database
Вопрос:
Это мой текущий рабочий запрос:
DECLARE @ProductName AS VARCHAR(400)
SET @ProductName = 'water'
SET @ProductName = CONCAT('"',@ProductName,'"')
SELECT
*,
distance = GEOGRAPHY::Point(42, -90, 4326).STDistance(GEOGRAPHY::Point(latitude, longitude, 4326)) / 1609.344
FROM
products AS FT_TBL
INNER JOIN
FREETEXTTABLE(products, product_name, @ProductName) AS KEY_TBL ON FT_TBL.id = KEY_TBL.[key]
WHERE
KEY_TBL.RANK >= 10
ORDER BY
KEY_TBL.RANK DESC, distance ASC
Я пытаюсь добавить проверку distance < 20
перед выполнением соединения, но она не работает, что бы я ни делал, я получаю сообщение об ошибке
Недопустимое имя столбца ‘расстояние’
даже если я попытаюсь выполнить запрос where.
Как я могу сделать это эффективным образом, прежде чем я даже сделаю объединение?
Комментарии:
1. Поместите его в подзапрос. В стороне: это может быть интересно от @BrentOzar, почему запросы Full Text CONTAINS выполняются так медленно
2. спасибо за ссылку, но нет, спасибо за бесполезный совет
3. Что вы нашли в этом бесполезным? Я считаю, что это то же самое, что и принятый ответ
Ответ №1:
Вам нужно сначала использовать подзапрос, чтобы фактически создать таблицу со distance
столбцом, прежде чем включать ее в предложение where.
SELECT * FROM (
SELECT *,
distance = GEOGRAPHY::Point(42, -90, 4326).STDistance(GEOGRAPHY::Point(latitude, longitude, 4326)) / 1609.344
FROM products ) AS FT_TBL
INNER JOIN FREETEXTTABLE(products, product_name, @ProductName) AS KEY_TBL ON FT_TBL.id = KEY_TBL.[key]
WHERE KEY_TBL.RANK >= 10 AND distance < 20 ORDER BY KEY_TBL.RANK DESC ,distance asc
это должно работать просто отлично.
Комментарии:
1. не могли бы вы показать мне, как я не знаком с подзапросами
2. вы не можете включить
distance
столбец в предложение where, думайте так,where
это оператор фильтра, который фильтрует нужные вам данные, поэтому он не может фильтровать то, чего еще нет. Но с помощью подзапроса вы уже создаете «таблицу» соdistance
столбцом, поэтому будет неплохо поместить ее вwhere
предложение.