मैं कथन को फिर से लिखने का सुझाव देता हूं ताकि केवल एक बाध्य तर्क हो। यह दृष्टिकोण बदसूरत है, लेकिन परिणाम सेट देता है:
select max(col1)
, f_col2
from (
select col1
, f(? ,col2) as f_col2
from t
)
group
by f_col2
इस पुन:लिखित कथन में केवल एक बाइंड तर्क का संदर्भ है, इसलिए अब डीबीएमएस ग्रुप बाय क्लॉज में अभिव्यक्तियों को देखता है और चयन सूची समान होती है।
एचटीएच
[संपादित करें]
(मेरी इच्छा है कि एक सुंदर तरीका था, यही कारण है कि मैं नामित बाइंड तर्क दृष्टिकोण पसंद करता हूं जो ओरेकल उपयोग करता है। पर्ल डीबीआई ड्राइवर के साथ, स्थितित्मक तर्कों को वास्तव में ओरेकल को भेजे गए बयान में नामित तर्कों में परिवर्तित कर दिया जाता है।)
मैंने पहली बार में समस्या नहीं देखी, मुझे मूल प्रश्न समझ में नहीं आया। (जाहिर है, कई अन्य लोगों ने भी इसे याद किया।) लेकिन कुछ परीक्षण मामलों को चलाने के बाद, मुझे पता चला कि समस्या क्या थी, प्रश्न क्या काम कर रहा था।
मुझे देखने दो कि क्या मैं समस्या बता सकता हूं:दो अलग (स्थितिगत) बाइंड तर्कों का इलाज कैसे करें (डीबीएमएस द्वारा) जैसे कि यह एक ही (नामित) बाइंड तर्क के दो संदर्भ थे।
डीबीएमएस ग्रुप बाय में एक्सप्रेशन से सेलेक्ट लिस्ट में एक्सप्रेशन से मेल खाने की उम्मीद कर रहा है। लेकिन दो भावों को अलग-अलग माना जाता है, तब भी जब भाव समान होते हैं, जब केवल अंतर यह होता है कि प्रत्येक अभिव्यक्ति एक अलग बाँध चर का संदर्भ देती है। (हम कुछ परीक्षण मामलों को प्रदर्शित कर सकते हैं जो कम से कम कुछ डीबीएमएस अनुमति देंगे, लेकिन ऐसे और भी सामान्य मामले हैं जो अपवाद पैदा करेंगे।)
इस बिंदु पर संक्षिप्त उत्तर है, कि मुझे स्टम्प्ड मिला है। मेरे पास सुझाव है (जो मूल प्रश्न का वास्तविक उत्तर नहीं हो सकता है) क्वेरी को पुनर्गठित करना है।
[/संपादित करें]
यदि यह दृष्टिकोण काम नहीं करता है, या यदि आपको इसका पता लगाने में कोई अन्य समस्या है, तो मैं अधिक विवरण प्रदान कर सकता हूं। या यदि प्रदर्शन में कोई समस्या है (मैं ऑप्टिमाइज़र को फिर से लिखित क्वेरी के लिए एक अलग योजना का चयन करते हुए देख सकता हूं, भले ही यह निर्दिष्ट परिणाम सेट देता है। आगे के परीक्षण के लिए, हमें वास्तव में यह जानना होगा कि डीबीएमएस क्या है, कौन सा ड्राइवर, सांख्यिकी, आदि)
संपादित करें (साढ़े आठ साल बाद)
एक प्रश्न को फिर से लिखने का एक और प्रयास। दोबारा, मैं जिस एकमात्र समाधान के साथ आया हूं वह एक बाइंड प्लेसहोल्डर के साथ एक प्रश्न है। इस बार, हम इसे एक इनलाइन दृश्य में चिपकाते हैं जो एक पंक्ति लौटाता है, और इसे t से जोड़ता है। मैं देख सकता हूँ कि यह क्या कर रहा है; मुझे यकीन नहीं है कि Oracle अनुकूलक इसे कैसे देखेगा। हम स्पष्ट रूप से रूपांतरण करना चाहते हैं (या आवश्यकता) उदा। TO_NUMBER(?) AS param
, TO_DATE(?,'...') AS param
, TO_CHAR(?) AS param
, बाइंड पैरामीटर के डेटाटाइप के आधार पर, और डेटाटाइप जिसे हम दृश्य से वापस करना चाहते हैं।)
इस तरह मैं इसे MySQL में करूँगा। मेरे उत्तर में मूल क्वेरी इनलाइन दृश्य (MySQL व्युत्पन्न तालिका . के अंदर जुड़ने का कार्य करती है ) और अगर हम इससे बच सकते हैं तो हम ह्यूजजस व्युत्पन्न तालिका को भौतिक बनाने से बचना चाहते हैं। फिर से, MySQL शायद मूल क्वेरी को तब तक स्लाइड करने देगा जब तक sql_mode
ONLY_FULL_GROUP_BY
. शामिल नहीं है . MySQL हमें FROM DUAL
. को भी छोड़ने देगा )
SELECT MAX(t.col1)
, f( v.param ,t.col2)
FROM t
CROSS
JOIN ( SELECT ? AS param FROM DUAL) v
GROUP
BY f( v.param ,t.col2)
MadusankaD के उत्तर के अनुसार, पिछले आठ वर्षों के भीतर, Oracle ने JDBC ड्राइवर में समान नामित बाइंड मापदंडों का पुन:उपयोग करने और तुल्यता बनाए रखने के लिए समर्थन जोड़ा है। (मैंने इसका परीक्षण नहीं किया है, लेकिन अगर यह अभी काम करता है, तो बढ़िया।)