2013-04-10 10 views
9

से पहले चल रही है यह क्यों काम नहीं करती है?आंतरिक क्वेरी आंतरिक क्वेरी

select * 
from 
(
    select membership_number 
    from members 
    where membership_number not like '%[^0-9]%' 
) mem 
where cast(membership_number as int) > 2 

SQL Fiddle Demo देखें।

सबक्वेरी है कि गैर सांख्यिक, और बाहरी क्वेरी एक पूर्णांक को यह कास्टिंग है, ताकि मैं कुछ भी के लिए देख सकते डेटा को फ़िल्टर करना चाहिए> 2.

ऐसा लगता है इसके बारे में जहां खंड चल रहा है की तरह पहले बाहरी क्वेरी। मैं इसके आसपास कैसे पहुंचू?

+0

क्या आप यह सुनिश्चित करने के लिए आंतरिक क्वेरी चलाते हैं कि आप क्या उम्मीद कर रहे हैं? – OldProgrammer

+2

ठंडा है। मैंने कभी एसक्यूएल फिडल के बारे में कभी नहीं सुना। – anthonybell

+0

@ ओल्डप्रोग्रामर- हाँ मेरे पास है, और आंतरिक क्वेरी ठीक काम करती है। मैंने सीटीई की कोशिश की है और यह वही काम करता है। एकमात्र तरीका यह है कि मैं इसे काम पर ला सकता हूं यदि मैं 'test_table' में सदस्यता संख्या का चयन करता हूं और फिर उस तालिका के साथ सबक्वायरी को प्रतिस्थापित करता हूं। – Lock

उत्तर

1

बहुत रोचक, मैंने इसे SQL सर्वर पर पुन: पेश करने का प्रयास किया और अगला पाया। मैं तो बस यह सुनिश्चित करें कि क्वेरी असफल नहीं हो बनाने के लिए और मैं कार्य योजना लागू करके देख सकते हैं सरल करने के लिए आपकी क्वेरी बदल दिया है:

[master].[dbo].[members].[membership_number]>'2' 
    AND NOT [master].[dbo].[members].[membership_number] like '%[^0-9]%' 

तो इस वजह से है:

select * 
from 
(
    select membership_number 
    from members 
    where membership_number not like '%[^0-9]%' 
) mem 
where membership_number > '2' 

निष्पादन योजना है तालिका स्कैन विधेय के साथ है एसक्यूएल ऑप्टिमाइज़ेशन इंजन इस तरह से काम करता है (जैसा कि किसी ने कहा - कोई भी आपको क्लॉज के आदेश की गारंटी नहीं दे सकता है)। तरीके शायद इसे ठीक करने में से एक से पहले

select * 
from 
(
    select membership_number 
    from members 
    where membership_number not like '%[^0-9]%' 
) mem 
where ISNUMERIC(mem.membership_number) = 1 and cast(mem.membership_number as int) > 2 
2

हो सकता है कि:

select * 
from 
(
    select 
     membership_number 
    from 
     members 
    where 
     membership_number not like '%[^0-9]%' 
) mem 
where Try_Convert(int, membership_number) > 2 
+2

यह केवल एसक्यूएल 2012 द्वारा समर्थित है, है ना? –

+0

@EthanLi हाँ, लेकिन सवाल में एक संस्करण निर्दिष्ट नहीं किया था। – mkjasinski

+0

सच है, बस इसे स्पष्ट करने का प्रयास करें –

1

मैं इस मुद्दे से पहले किया था। क्या मैंने किया था: यह

3 के लिए उपयोग अस्थायी तालिका

select membership_number 
    from members 
    where membership_number not like '%[^0-9]%' 

2, या, या मामले खंड का उपयोग करें::

1, आप एक दृश्य जो करता है हो सकता है

select * 
from 
(
    select membership_number 
    from members 
    where membership_number not like '%[^0-9]%' 
) mem 
where (CASE WHEN ISNUMERIC(membership_number) THEN cast(membership_number as int) ELSE 0 END) > 2 

में कोई सुरुचिपूर्ण समाधान नहीं था, लेकिन उम्मीद है कि इससे

0

टिप्पणियां बताती हैं कि निष्पादन योजना कैसे सी एक (कभी-कभी) like से पहले cast का मूल्यांकन करना चुनते हैं। case कथन मूल्यांकन के आदेश की सहायता कर सकता है लेकिन एडम्स का उल्लेख है कि यह विधि भी 100% नहीं है।

select * 
from members 
where case 
      when membership_number like '%[^0-9]%' then 0 
      when cast(membership_number as int) > 2 then 1 
      else 0 
     end = 1 
+1

'केस 'कथन हमेशा शॉर्ट सर्किट नहीं करते हैं: [कनेक्ट आइटम] (http://connect.microsoft.com/SQLServer/feedback/details/690017/case-coalesce-wont- हमेशा-मूल्यांकन-इन-टेक्स्टुअल-ऑर्डर) –

+0

@AdamWenger पोस्ट में नोट किया गया। +1 –

+1

@AdamWenger: लेख में, यह कुल कार्यों के साथ एक विशिष्ट मामला का उल्लेख करता है, जिसे पहले हमेशा मूल्यांकन किया जाना निर्दिष्ट है। ओपी के सवाल में, कोई कुल कार्य नहीं है, इसलिए यह कोई समस्या नहीं होनी चाहिए। और, हमेशा के रूप में, सत्यापित करने के लिए परीक्षण। – siride

0

ISNUMERIC उपयोग करने के लिए आप इस कोशिश कर सकते हैं निम्न क्वेरी पहली शर्त क्रियान्वित किया जाता है, और अगर यह तो विफल रहता है ना 2 हालत कार्यान्वित होगा

select 
    membership_number 
    from 
    members 
where 
isnumeric(membership_number) = 1 and 
cast(membership_number as int) > 2 

और यह जवाब देने के लिए कि आपकी क्वेरी क्यों काम नहीं कर रही है, यह जांचें explanation here

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