使用 having 的 sqlite 在 java 中的错误结果

wrong result in java with sqlite using having

我有一个 table 具有以下数据

taskid   bind_address           type_id
1        tcp://10.10.1.2:8001   3
1        tcp://127.0.0.1:8000   2
2        tcp://10.10.1.2:8003   3
2        tcp://127.0.0.1:8002   2
3        tcp://10.10.1.2:8005   3
3        tcp://127.0.0.1:8004   2
4        tcp://10.10.1.3:8007   3
4        tcp://127.0.0.1:8006   2
5        tcp://10.10.1.4:8009   3
5        tcp://127.0.0.1:8008   2
6        tcp://10.10.1.4:8011   3
6        tcp://127.0.0.1:8010   2
7        tcp://10.10.1.5:8011   3
7        tcp://127.0.0.1:8012   2

与此sql声明

select task_id, bind_address,type_id 
From task_pub tp    
join task t   
    on tp.task_id=t.id  
join host h                          
    on t.host_id=h.id   
where h.id=3                      
group by h.id, task_id      
having min(type_id);

每个任务我只想获得最低的行 type_id 如果我用 sqlite3 执行这个语句,我得到这个作为结果

2        tcp://127.0.0.1:8002   2
5        tcp://127.0.0.1:8008   2
6        tcp://127.0.0.1:8010   2

但是使用 java 和 jdbc 驱动程序 sqlite 我得到这个(错误的)结果

2        tcp://10.10.1.2:8003 3
5        tcp://10.10.1.4:8009 3
6        tcp://10.10.1.4:8011 3

java中的sql语句是100%正确的,我在调试模式下复制了语句

having min(type_id) 等同于:

having min(type_id) <> 0

据推测,您想要每个 task_id 的最小值 type_id。这是一种方法:

select task_id, bind_address, type_id 
From task_pub tp join
     task t   
     on tp.task_id = t.id join
     host h                          
     on t.host_id = h.id   
where h.id = 3 and
      not exists (select 1
                  from task_pub tp2
                  where tp2.task_id = tp.task_id and
                        tp2.host_id = tp.host_id and
                        tp2.type_id < tp.task_id
                 ) ;