2009-12-17 13 views
5

को मजबूर करने के लिए पूछताछ मैं किसी भी रिकॉर्ड को वापस किए बिना एक चयन क्वेरी करने के लिए एक एएनएसआई-एसक्यूएल विधि की तलाश में हूं, लेकिन एक टीडीटासेट की फ़ील्ड संरचना भरें।एएनएसआई एसक्यूएल क्वेरी 0 रिकॉर्ड्स

विधि मैंने पाया जोड़कर एक "जहां 1 = 0" किसी भी प्रश्न में, उदाहरण के लिए:

Select Id, name, province 
from customers 
where 1=0 

यह एक काफी तुच्छ उदाहरण है, यह एक छोटे और अधिक जटिल है जब मैं काम करना है बदल जाता है उपयोगकर्ता द्वारा दर्ज प्रश्नों के साथ, फिर उन्हें पार्स करें, जहां खंड पहले से है, तो हटाएं, और "1 = 0" द्वारा प्रतिस्थापित करें।

उपयोगकर्ता के प्रवेश किया क्वेरी में पिछले खंड जहां खंड है, तो वहाँ कोई समस्या नहीं सब पर है, लेकिन इस तरह और अधिक जटिल प्रश्नों के बारे में क्या:

select 
    c.lastname, 
    sum(cs.amount) 
from customersales cs 
join customers c on c.idcustomer=cs.idcustomer 
/* where 1=0 */ 
group by c.idcustomer, c.lastname 

"जहां 1 = 0 का उपयोग करके "विधि, पिछले उदाहरण में इसे सम्मिलित करने का एकमात्र तरीका एक शक्तिशाली एसक्यूएल पार्सर है (याद रखें कि उपयोगकर्ता जटिल प्रश्नों को शामिल कर सकता है, जिसमें सबकुरीज़ और सब कुछ शामिल है), जो यह समझ सकते हैं कि इस स्ट्रिंग को कहां शामिल करना है।

क्या कोई इसे करने का बेहतर तरीका जानता है? मैं "सीमा 1" का उपयोग नहीं कर सकता क्योंकि यह एक एएनएसआई तरीके से होना चाहिए।

+0

आपको इसकी क्या आवश्यकता है? –

+0

मुझे इसकी आवश्यकता है क्योंकि मैं एक सॉफ़्टवेयर में एक सुविधा जोड़ रहा हूं, जो उपयोगकर्ता को कस्टम-निर्मित क्वेरी बनाने देता है, फिर चार्ट, टेबल्स दिखाने और उनके उपयोग से रिपोर्ट बनाने के लिए क्वेरी का उपयोग करें। मुझे रिपोर्ट तैयार करने के लिए इसकी आवश्यकता है। उपलब्ध डेटासेट (उपयोगकर्ता द्वारा किए गए प्रश्नों से निकाले गए) के साथ रिपोर्ट डिज़ाइनर दिखाने के लिए मुझे इस सुविधा की आवश्यकता है। "डेटासेट" प्रश्नों के बाद निकाले गए फ़ील्ड की सरल सूचियां हैं। बीटीडब्ल्यू, मैं फास्ट रिपोर्ट 4 का उपयोग कर रहा हूं। ग्राहक निर्मित क्वेरी बनाने के लिए –

+0

: आप तेजी से रिपोर्ट के साथ तेज क्वेरी निर्माता का उपयोग क्यों नहीं करते हैं। और तेजी से घन क्यों नहीं? –

उत्तर

11

उपयोगकर्ता के चयन के आस-पास अपना स्वयं का चयन जोड़ने के बारे में क्या?

SELECT * FROM (
select 
    c.lastname, 
    sum(cs.amount) 
from customersales cs 
join customers c on c.idcustomer=cs.idcustomer 
/* where 1=0 */ 
group by c.idcustomer, c.lastname 
) x 
WHERE 0=1 

संपादित करें:ORDER BY कि समाधान के साथ काम नहीं करेंगे, लेकिन जब से तुम कोई भी पंक्ति मिलता है, आप को दूर करने के लिए कि क्वेरी से जब आवश्यक की कोशिश कर सकते।

+1

धन्यवाद पीटर, PostgreSql और फायरबर्ड में परीक्षण किया और यह काम करता है! मुझे केवल एक चीज जोड़ने के लिए आंतरिक क्वेरी के लिए उपनाम था। * से (आंतरिक क्वेरी) AS FOO चुनें जहां 1 = 0। फिर से धन्यवाद। –

0

भविष्य में संदर्भ के लिए यदि लोग यहां एक अलग लक्ष्य के साथ समाप्त होते हैं: ध्यान दें कि WHERE-clause को एक विरोधाभास बनाने से ऑप्टिमाइज़र उप-योजना निष्पादित करने का निर्णय ले सकता है। इसलिए यदि आपको क्वेरी के कुछ दुष्प्रभावों की आवश्यकता है (चाहे वह कैश गर्म हो, प्रक्रिया को निष्पादित करें, जो भी हो), सलाह दी जानी चाहिए। :-)

0

अपने MSSQL सर्वर का उपयोग कर, तो आप अपने क्वेरी लपेट कर सकते हैं अगर SET FMTONLY

SET FMTONLY ON SELECT * FROM tablename SET FMTONLY OFF 
0

आसपास Firebird में आप के बजाय 'पर अमल' इसके बारे में बयान 'तैयार' कर सकते हैं। तैयारी बस बयान को पार करती है और फ़ील्ड सूची देता है।

0

या का उपयोग

CustomerSQL='SELECT <Fields> FROM <Table>'; 
MySQL=Replace(CustomerSQL,'SELECT ','SELECT TOP 0 '); 

(- एक का चयन करें टॉप 0 केवल रिकॉर्ड लेआउट युक्त मेटा डेटा और कोई रिकॉर्ड डेटा देगी शायद कुछ विवेक की जाँच के साथ है, लेकिन आप अंदाजा हो)।

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