SQL Server, где запрос не работает после объединения и нового столбца

#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 предложение.