我有两个具有1-n关系的表,即存储订单的表order和存储订单位置的表orderposition。
在连接两个表的同时从数据库获取数据时,我想限制订单的数量。当限制两个表的连接之后,这显然不起作用,因为一个订单可能会导致多个记录,这取决于订单的位置数。
这是我现在和jooq写的:
final Table<Record> alias = context.select().from(ORDER).limit(1).asTable();
final Result<Record> result =
context
.select()
.from(alias.join(ORDER_POSITION)
.on(ORDER_POSITION.ORDER_ID.eq(alias.field(ORDER.ID))))
.fetch();
这似乎并没有限制订单的数量,它返回我不止一个订单。另一方面,如果我用一个leftjoin替换连接,限制也会按预期工作(也适用于不同的限制参数)。我使用了一个h2db来测试查询(不确定它是否重要)。
我知道join和leftjoin的区别,但这两种情况下的限制是否应该按预期的那样起作用,还是我遗漏了什么?
这是jooq通过join生成的:
select
"alias_129458832"."ID",
"alias_129458832"."KEY",
...
"PUBLIC"."ORDER_POSITION"."ID",
"PUBLIC"."ORDER_POSITION"."ORDER_ID"
from (
select
"PUBLIC"."ORDER"."ID",
"PUBLIC"."ORDER"."KEY",
...
from "PUBLIC"."ORDER"
limit ?
) "alias_129458832"
join "PUBLIC"."ORDER_POSITION"
on "PUBLIC"."ORDER_POSITION"."ORDER_ID" =
"alias_129458832"."ID"
如果我用一个leftjoin替换查询,它会生成一个相同的查询,除非该连接被“leftouterjoin”替换。
我测试的内容
我用内存中的h2数据库运行测试。我有几个订单没有任何位置,一个订单有一个位置,一个订单有三个位置。
当连接限制为1时,我得到所有4条连接的记录(这意味着它同时返回两个订单),当限制为0时,我没有记录。顺序有一个随机键,它总是为每个测试随机生成的。如果我用这把钥匙
context.select().from(ORDER).orderBy(ORDER.KEY).limit(4).asTable();
限制为4,有时没有记录,有时一个记录(一个位置的顺序),有时三个记录(三个位置的顺序),有时全部四个记录(两个都是顺序)。
如前所述,如果我用leftjoin替换连接,我当然也得到了没有任何位置的顺序,但是这里用限制指定的顺序数总是正确的。
暂无答案!
目前还没有任何答案,快来回答吧!