select
SQRT(
POWER(cast(Program_Latitude as float) - cast('41.5126237' as float), 2) +
POWER(cast(Program_Longitude as float) - cast('-81.6516411' as float), 2)
) * 62.1371192 AS DistanceFromAddress
from tblProgram
having DistanceFromAddress < 2
có thể hoạt động (mặc dù tôi nghĩ không, không có nhóm theo điều khoản).
Vấn đề là bạn chỉ có thể sử dụng tên trong phạm vi (các) bảng bạn chọn bên trong mệnh đề where
. Where
là một bộ lọc trước lọc ra các hàng trước khi chúng được chọn, vì vậy các biểu thức như thế này trong định nghĩa trường chưa được thực hiện và các bí danh không có sẵn.
Điều khoản Having
hoạt động như bộ lọc bài đăng sau khi nhóm và có thể sử dụng bí danh từ truy vấn, mặc dù tôi e rằng bạn sẽ cần phải có mệnh đề group by
thực tế (không chắc chắn).
Cách khác là chọn một phụ (bảng có nguồn gốc hoặc chọn trong lựa chọn), trước tiên bạn chọn khoảng cách cho mỗi hàng và sau đó chỉ chọn khoảng cách có liên quan từ các kết quả đó. Điều này sẽ hoạt động:
select d.DistanceFromAddress
from
(select
SQRT(
POWER(cast(Program_Latitude as float) - cast('41.5126237' as float), 2) +
POWER(cast(Program_Longitude as float) - cast('-81.6516411' as float), 2)
) * 62.1371192 AS DistanceFromAddress
from tblProgram) d
where d.DistanceFromAddress < 2
Hoặc bạn có thể lặp lại biểu thức. Điều này làm cho truy vấn của bạn khó duy trì hơn, nhưng trong một số trường hợp, điều này có thể phù hợp với bạn. Ví dụ: nếu bạn không muốn trả lại khoảng cách thực tế, nhưng chỉ, ví dụ, tên của điểm quan tâm ở khoảng cách đó. Trong trường hợp đó, bạn cần phải có biểu thức chỉ trong mệnh đề where
, trong trường hợp đó, đối số bảo trì đã biến mất và giải pháp này là giải pháp thay thế hoàn hảo.
select
tblProgram.POIname
/* Only if you need to return the actual value
, SQRT(
POWER(cast(Program_Latitude as float) - cast('41.5126237' as float), 2) +
POWER(cast(Program_Longitude as float) - cast('-81.6516411' as float), 2)
) * 62.1371192 AS DistanceFromAddress */
from tblProgram
where
-- Use this if you only want to filter by the value.
SQRT(
POWER(cast(Program_Latitude as float) - cast('41.5126237' as float), 2) +
POWER(cast(Program_Longitude as float) - cast('-81.6516411' as float), 2)
) * 62.1371192 < 2
Bản sao có thể có của [Tham khảo bí danh cột trong một điều khoản WHERE] (https://stackoverflow.com/questions/8370114/referring-to-a-column-alias-in-a-where-clause) – Vadzim
I quess, chỉ cần nhân đôi biểu thức đó mệnh đề 'WHERE' sẽ đưa ra kế hoạch tốt hơn so với các câu hỏi con được đề xuất trong các câu trả lời ở đây. – Vadzim