Bu question'u basitleştirilmiş ve genişletilmiş bir şekilde yeniden soruyorum. Bildiğim kadarıyla, MySQL'in söyleyebilirimSELECT sonuçları neden mysql ve sqlite arasında farklılık gösteriyor?
+------+--------+
| id | avg1 |
+------+--------+
| 106 | 4.5000 |
+------+--------+
: sqlite kullanarak
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);
, select
deyimi döndürür:
id avg1
---------- ----------
106 4.5
107 4.0
ve MySQL döner
bu sql ifadeleri düşünün sonuçlar doğru ve sqlite yanlış. Aşağıdaki gibi sqlite ilereal
yayın yapmak için çalıştı ama yine de iki kayıt döndürür:
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);
neden sqlite dönüş iki kayıtlar?
Hızlı güncelleme:
Ben son sqlite sürümü (3.7.11) ve yine iki kayıtları almak karşı bildiri koştu.
Diğer bir güncelleme:
Ben konu hakkında [email protected] bir e-posta gönderdi.
Kendim, VDBE ile oynuyordum ve ilginç bir şey buldum. not exists
'un her döngüsünün yürütme izini bölüyorum (her bir avg grubu için bir tane). Biz açıkça bir şekilde r:4.5
i:5
haline gelmiştir ne olması gerektiğini görüyoruz
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);
:
üç ort gruplarını sahip olmak için, ben şu ifadeleri kullandı şimdi çalışıyorum
bunun neden olduğunu görmek için.
Final düzenlemek:
yüzden sqlite kaynak kodu ile yeterince oynuyoruz. o zaten bunu yapıyor gibi görünüyor gibi ben original developer tür dışarı bildireceğiz rağmen, şimdi çok daha iyi canavar anlıyorum:http://www.sqlite.org/src/info/430bb59d79
İlginçtir en azından bana, öyle görünüyor ki, (daha yeni sürümleri bu Yukarıda belirtilen ilave bir test durumda kullanılan olarak kullanıyorum sürümü sonra bazı kez) birden fazla kayıt ekleme destekler taahhüt:
CREATE TABLE t34(x,y);
INSERT INTO t34 VALUES(106,4), (107,3), (106,5), (107,5);
avg1' bulunamadı. Bunları 'MAX (T2.score) 've' MAX (T1.score) 'ile değiştirdim ve SQLite sonucunu verdi. Tabloyu "GERÇEK" ile oluşturduğumda MySQL sonucunu verdi. Belki de MySQL şemanınız sqlites'ten farklı mıdır? –
@ ta.speot.is: avg (t2.score) olarak avg2' olarak (iki olay) olarak "ekliyor" ifadesini ekleyebilir misiniz? –
Çalışmıyor. Oldukça emin SQL Server "WHERE", "GROUP BY" veya "HAVING" de takma adlar söz konusu olduğunda zar oynamaz. –