मैं एक सरल और विस्तारित तरीके से यह question फिर से पूछ रहा हूं। जहाँ तक मेरा बता सकते हैं, mysql केMySQL और sqlite के बीच चयन परिणाम क्यों भिन्न होते हैं?
+------+--------+
| id | avg1 |
+------+--------+
| 106 | 4.5000 |
+------+--------+
:
create table foo (id INT, score INT);
insert into foo values (106, 4);
insert into foo values (107, 3);
insert into foo values (106, 5);
insert into foo values (107, 5);
select T1.id, avg(T1.score) avg1
from foo T1
group by T1.id
having not exists (
select T2.id, avg(T2.score) avg2
from foo T2
group by T2.id
having avg2 > avg1);
SQLite का उपयोग करना, select
बयान रिटर्न:
id avg1
---------- ----------
106 4.5
107 4.0
और mysql रिटर्न
इन एसक्यूएल बयान पर विचार करें परिणाम सही हैं, और एसक्लाइट गलत हैं। मैं निम्नलिखित के रूप में SQLite साथ real
को कास्ट करने के लिए करने की कोशिश की लेकिन यह अभी भी दो रिकॉर्ड रिटर्न:
select T1.id, cast(avg(cast(T1.score as real)) as real) avg1
from foo T1
group by T1.id
having not exists (
select T2.id, cast(avg(cast(T2.score as real)) as real) avg2
from foo T2
group by T2.id
having avg2 > avg1);
क्यों SQLite वापसी दो रिकॉर्ड?
त्वरित अद्यतन:
मैं नवीनतम SQLite संस्करण (3.7.11) और अभी भी दो रिकॉर्ड मिल के खिलाफ बयान भाग गया।
कोई अन्य अपडेट:
मैं इस मुद्दे के बारे में [email protected] को एक ईमेल भेजा।
स्वयं, मैं वीडीबीई के साथ खेल रहा हूं और कुछ दिलचस्प पाया है। मैंने not exists
(प्रत्येक औसत समूह के लिए एक) के प्रत्येक लूप के निष्पादन ट्रेस को विभाजित किया।
create table foo (id VARCHAR(1), score INT);
insert into foo values ('c', 1.5);
insert into foo values ('b', 5.0);
insert into foo values ('a', 4.0);
insert into foo values ('a', 5.0);
PRAGMA vdbe_listing = 1;
PRAGMA vdbe_trace=ON;
select avg(score) avg1
from foo
group by id
having not exists (
select avg(T2.score) avg2
from foo T2
group by T2.id
having avg2 > avg1);
हम स्पष्ट रूप से देख कि किसी भी तरह क्या होना चाहिए r:4.5
i:5
बन गया है::
तीन औसत समूहों करवाने के लिए, मैं निम्नलिखित बयानों का इस्तेमाल किया
मैं अब कोशिश कर रहा हूँ यह देखने के लिए कि क्यों है।
अंतिम संपादित:
तो मैं SQLite स्रोत कोड के साथ पर्याप्त खेल रहा है। मैं जानवर काफी बेहतर अब समझते हैं, हालांकि मैं original developer तरह इसे बाहर दूँगा के रूप में वह पहले से ही यह कर किया जा रहा है:
http://www.sqlite.org/src/info/430bb59d79
दिलचस्प है, मुझे कम से कम करने के लिए, ऐसा लगता है कि नए संस्करण (संस्करण मैं उपयोग कर रहा हूँ के बाद कुछ समय) एक से अधिक रिकॉर्ड डालने का समर्थन करता है के रूप में एक परीक्षण का मामला ऊपर उल्लिखित में जोड़ा में इस्तेमाल के लिए प्रतिबद्ध:
CREATE TABLE t34(x,y);
INSERT INTO t34 VALUES(106,4), (107,3), (106,5), (107,5);
बस किक के लिए मैं एसक्यूएल को यह चलाया, तो SQL सर्वर का उत्पादन होगा और यह 'शिकायत की avg2' और' avg1' मौजूद नहीं था। मैंने उन्हें 'MAX (T2.score) 'और' MAX (T1.score)' के साथ बदल दिया और यह SQLite परिणाम दिया। जब मैंने 'स्कोर रीयल' के साथ तालिका बनाई तो उसने MySQL परिणाम दिया। शायद आपकी MySQL स्कीमा sqlites के लिए अलग है? –
@ ta.speot.is: क्या आप avg2' (दो मौके) के रूप में 'avg (T2.score) में' as' जोड़ने का प्रयास कर सकते हैं? –
काम नहीं करता है। जब भी 'WHERE', 'GROUP BY' या' HAVING' में उपनामों का उपयोग करने की बात आती है तो निश्चित रूप से SQL सर्वर पासा नहीं चलाता है। –