2013-04-23 13 views
29

जब मैं मैं त्रुटि हो रही हैकैसे जहां एसक्यूएल सर्वर में खंड

अमान्य स्तंभ नाम DistanceFromAddress

कोड SQL सर्वर 2005 में नीचे दिए गए कोड को निष्पादित करने की कोशिश की में उर्फ ​​स्तंभ नाम का उपयोग करने के लिए:

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 
where 
    DistanceFromAddress < 2 

मैं सही ढंग से बयान का चयन का उपयोग कर मूल्यों हो रही है, लेकिन जब मैं शर्त where DistanceFromAddress < 2 जाँच करने की कोशिश की मैं त्रुटि हो रही है।

मैं इस मुद्दे को कैसे हल कर सकता हूं?

+0

संभावित डुप्लिकेट [WHERE क्लॉज में कॉलम उपनाम का जिक्र करते हुए] (https://stackoverflow.com/questions/8370114/referring-to-a-column-alias-in-a-where-clause) – Vadzim

+0

I quess, सिर्फ अभिव्यक्ति को डुप्लिकेट करना 'WHERE' खंड यहां उत्तर में प्रस्तावित उपकुवेशियों की तुलना में बेहतर योजना प्रदान करेगा। – Vadzim

उत्तर

35

आप WHERE खंड में एलियाड कॉलम का उपयोग नहीं कर सकते हैं। आप व्युत्पन्न तालिका का उपयोग करने का प्रयास कर सकते हैं।शायद इस तरह कुछ (क्षमा करें, परीक्षण नहीं किया गया):

SELECT * 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) mytable 
WHERE DistanceFromAddress < 2 
24

WHERE खंड से पहलेSELECT खंड (*) संसाधित किया जाता है, और इसलिए उपनाम उपलब्ध नहीं हैं। एक सबक्वेरी या CTE उपयोग करने के लिए ले जाएँ - यहाँ एक CTE है:

; with Distances as (
    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 
) 
select * from Distances where DistanceFromAddress < 2 

(*) - ठीक है, सिस्टम मुक्त पुनः आदेश देने के संचालन के रूप में वे फिट देख, जब तक कि परिणाम "के रूप में अगर है "एसक्यूएल कथन को एक निश्चित logical order में संसाधित किया गया था। बेशक, एसक्यूएल सर्वर के साथ यह सब गलत हो गया है, जहां SELECT में रूपांतरण समस्याओं के कारण पंक्तियों/मानों के लिए खंड WHERE खंड द्वारा समाप्त किया जाना चाहिए।

1
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 

काम कर सकता है (हालांकि मुझे लगता है कि, क्लॉज द्वारा समूह के बिना भी)।

समस्या यह है कि आप केवल where खंड के अंदर चयनित तालिका (तालिका) के दायरे में नामों का उपयोग कर सकते हैं। Where एक पूर्व फ़िल्टर है जो पंक्तियों को उनके चयन से पहले फ़िल्टर करता है, इसलिए फ़ील्ड परिभाषा में इस तरह के अभिव्यक्ति अभी तक निष्पादित नहीं हैं और उपनाम उपलब्ध नहीं हैं।

Having क्लॉज समूह के बाद पोस्ट फ़िल्टर के रूप में काम करता है और क्वेरी से उपनाम का उपयोग कर सकता है, हालांकि मुझे डर है कि आपको वास्तविक group by क्लॉज (सुनिश्चित नहीं) होना चाहिए।

विकल्प उप-चयन (व्युत्पन्न तालिका या चयन में चयन करें) है, जहां आप पहले प्रत्येक पंक्ति के लिए दूरी का चयन करते हैं, और फिर केवल उन परिणामों से प्रासंगिक दूरी का चयन करें। यह काम करेगा:

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 

या आप अभिव्यक्ति दोहरा सकते हैं। यह आपकी क्वेरी को बनाए रखने के लिए कठिन बनाता है, लेकिन कुछ मामलों में यह आपके लिए काम कर सकता है। उदाहरण के लिए यदि आप वास्तविक दूरी वापस नहीं करना चाहेंगे, लेकिन केवल उस दूरी पर ब्याज के बिंदु का नाम कहें। उस स्थिति में, where खंड में आपको केवल अभिव्यक्ति की आवश्यकता है, इस स्थिति में रखरखाव तर्क समाप्त हो गया है, और यह समाधान एक आदर्श विकल्प है।

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 
0

मुझे लगता है कि आप केवल अंतिम मान प्रदर्शित करने के लिए एएस का उपयोग कर सकते हैं। तुलना करने के लिए, चयन को इसके अंदर किसी अन्य चयन कथन से वापस किया जाना चाहिए।

तरह:

SELECT a.disfromaddr 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) 
a WHERE a.disfromaddr < 2 

आप इस कोशिश कर सकते हैं।

संबंधित मुद्दे