On Sun, Mar 3, 2013 at 2:48 PM, Tom Matrix <ratomat...@gmail.com> wrote:
> Hello, > > I’ve encountered a problem, which is hardly reproducable on arbitrary > databases, therefore I attached one. > Can you send the database directly to me at d...@sqlite.org please? > The problem is that inner join omits the result on large datasets. But > again, ’large’ does not necessarly refer simply the amount of data; I > couldn’t reproduce it on different (arbitrary) databases with larger > datasets, but I could on another database with the same structure. > > To be more specific: > > The following query reports 18900080 rows (after some computation time): > > SELECT COUNT(*) > FROM entryintervals ei1 > JOIN interval2label il1 ON ei1.id = il1.entry_intervalid > JOIN labels la1 ON il1.labelid = la1.id > JOIN labelgroups lg1 ON la1.groupid = lg1.id > JOIN entries en1 ON ei1.entryid = en1.id > JOIN modules mo1 ON en1.moduleid = mo1.id > JOIN measurements me1 ON en1.measurementid = me1.id > JOIN entries en2 ON en1.measurementid = en2.measurementid > JOIN modules mo2 ON en2.moduleid = mo2.id > JOIN entryintervals ei2 ON en2.id = ei2.entryid > JOIN interval2label il2 ON ei2.id = il2.entry_intervalid > LEFT JOIN labels la2 ON il2.labelid = la2.id > > However, the following one reports 0 rows immediately: > > SELECT COUNT(*) > FROM entryintervals ei1 > JOIN interval2label il1 ON ei1.id = il1.entry_intervalid > JOIN labels la1 ON il1.labelid = la1.id > JOIN labelgroups lg1 ON la1.groupid = lg1.id > JOIN entries en1 ON ei1.entryid = en1.id > JOIN modules mo1 ON en1.moduleid = mo1.id > JOIN measurements me1 ON en1.measurementid = me1.id > JOIN entries en2 ON en1.measurementid = en2.measurementid > JOIN modules mo2 ON en2.moduleid = mo2.id > JOIN entryintervals ei2 ON en2.id = ei2.entryid > JOIN interval2label il2 ON ei2.id = il2.entry_intervalid > JOIN labels la2 ON il2.labelid = la2.id > > This is not what I expected. So I checked, that for example > > SELECT il2.labelid > FROM entryintervals ei1 > JOIN interval2label il1 ON ei1.id = il1.entry_intervalid > JOIN labels la1 ON il1.labelid = la1.id > JOIN labelgroups lg1 ON la1.groupid = lg1.id > JOIN entries en1 ON ei1.entryid = en1.id > JOIN modules mo1 ON en1.moduleid = mo1.id > JOIN measurements me1 ON en1.measurementid = me1.id > JOIN entries en2 ON en1.measurementid = en2.measurementid > JOIN modules mo2 ON en2.moduleid = mo2.id > JOIN entryintervals ei2 ON en2.id = ei2.entryid > JOIN interval2label il2 ON ei2.id = il2.entry_intervalid > LEFT JOIN labels la2 ON il2.labelid = la2.id > LIMIT 1 > > returns the id 47. The empty set, returned by the query containing > inner joins only, implies that no row exists with id 47 in the > ’labels’ table. This is, however, not true: > > SELECT * FROM labels WHERE id = 47 > > returns the appropriate row... > > I’m using the latest (SQLite version 3.7.15.2 2013-01-09 11:53:05) > version on Windows. > Previously, I used SQLite version 3.7.13 2012-06-11 02:05:22 with > Cygwin, which gave similar result, except that it was enough to have > less joins: > > SELECT COUNT(*) > FROM entryintervals ei1 > JOIN interval2label il1 ON ei1.id = il1.entry_intervalid > JOIN labels la1 ON il1.labelid = la1.id > JOIN labelgroups lg1 ON la1.groupid = lg1.id > JOIN entries en1 ON ei1.entryid = en1.id > JOIN modules mo1 ON en1.moduleid = mo1.id > JOIN measurements me1 ON en1.measurementid = me1.id > JOIN entries en2 ON en1.measurementid = en2.measurementid > JOIN modules mo2 ON en2.moduleid = mo2.id > [LEFT] JOIN entryintervals ei2 ON en2.id = ei2.entryid > > Have you ever experienced such behavior? > Please take a look at it, as it might be a rare but serious low-level > problem. > > Thanks, > Tamás > > _______________________________________________ > sqlite-users mailing list > sqlite-users@sqlite.org > http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users > > -- D. Richard Hipp d...@sqlite.org _______________________________________________ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users