Tôi đang yêu cầu lại question này theo cách đơn giản và được mở rộng.Tại sao kết quả SELECT khác nhau giữa mysql và sqlite?
Xem xét các báo cáo sql:
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);
Sử dụng SQLite, lợi nhuận select
tuyên bố:
id avg1
---------- ----------
106 4.5
107 4.0
và trả về mysql:
+------+--------+
| id | avg1 |
+------+--------+
| 106 | 4.5000 |
+------+--------+
Theo như tôi có thể nói, của mysql kết quả là chính xác và sqlite không chính xác. Tôi cố gắng để đúc để real
với sqlite như trong sau nhưng nó sẽ trả về hai kỷ lục vẫn:
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);
Tại sao sqlite trở lại hai kỷ lục?
nhanh cập nhật:
tôi chạy báo cáo kết quả so với phiên bản sqlite mới nhất (3.7.11) và vẫn nhận được hai hồ sơ.
Một cập nhật:
tôi đã gửi một email đến [email protected] về vấn đề này.
Bản thân tôi, tôi đã chơi với VDBE và tìm thấy điều gì đó thú vị. Tôi chia dấu vết thực hiện của mỗi vòng lặp not exists
(một cho mỗi nhóm avg).
Để có ba nhóm trung bình, tôi đã sử dụng các báo cáo sau:
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);
Chúng tôi rõ ràng thấy rằng bằng cách nào đó những gì cần được r:4.5
đã trở thành i:5
:
bây giờ tôi đang cố gắng để xem tại sao lại thế.
cuối cùng chỉnh sửa:
Vì vậy, tôi đã chơi đủ với mã nguồn sqlite. Tôi hiểu con thú tốt hơn bây giờ, mặc dù tôi sẽ cho các original developer loại nó ra khi ông dường như đã được làm việc đó:
http://www.sqlite.org/src/info/430bb59d79
Điều thú vị là, với tôi ít nhất, có vẻ như các phiên bản mới hơn (một số lần sau khi phiên bản tôi đang sử dụng) hỗ trợ chèn nhiều bản ghi được sử dụng trong một trường hợp thử nghiệm bổ sung trong nói trên cam kết:
CREATE TABLE t34(x,y);
INSERT INTO t34 VALUES(106,4), (107,3), (106,5), (107,5);
Chỉ cần cho đá Tôi chạy này để SQL gì SQL Server sẽ tạo ra và nó phàn nàn 'avg2' và' avg1' không tồn tại. Tôi đã thay thế chúng bằng 'MAX (T2.score)' và 'MAX (T1.score)' và nó cho kết quả SQLite. Khi tôi tạo ra bảng với 'điểm số REAL' nó đã cho kết quả MySQL. Có lẽ lược đồ MySQL của bạn khác với sqlites? –
@ ta.speot.is: bạn có thể thử thêm 'as' như trong' avg (T2.score) làm avg2' (hai lần xuất hiện) không? –
Không hoạt động. Khá chắc chắn SQL Server không chơi xúc xắc khi nói đến việc sử dụng bí danh trong 'WHERE',' GROUP BY' hoặc 'HAVING'. –