oracle查询-使用join在两个表中过滤和限制

5t7ly7z5  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(328)

为了实现以下用例,我在oracle query中遇到了一个问题,
假设我有两张table:

Table 1 : product
     productId - Integer - primaryKey
     productName - Varchar 

Table 2 : product_sequence
     productId - Integer - primaryKey
     sequenceId - Integer - primaryKey 
     orderId - Integer
     orderName - Varchar

产品表有1000个条目,产品序列表有10k个条目
要求:
(分页)获取产品表中从0到100/100到200/etc的条目
用于在ui中显示分页的productid的不同计数(请检查下面的示例查询)
按“product”表中的“productname”和“product\u sequence”表中的“ordername”筛选
查询(已尝试):

SELECT
  p.productId, p.productName, ps.orderId, ps.orderName, 
  COUNT(distinct p.productId) OVER () AS TOTAL 
FROM (
  select * 
  from product 
  OFFSET 0 ROWS FETCH NEXT 100 ROWS ONLY
 ) p 
JOIN product_sequence ps on p.productId=ps.productId 
WHERE ps.orderId IN ('12','13','14');

注意:上面的查询将在oracle中工作,但问题是
应为:从“product”表返回100个条目,并在“product\u sequence”表中Map条目
实际:它首先限制产品中的100个条目,然后过滤orderid,这样返回的条目数就从100减少到较少的数量我同意我的查询是不正确的:它首先在子查询中的“产品”表中限制100,然后在第二个表中进行过滤,从而减少计数
有人能帮我问一下这个问题吗?感谢您的帮助。
如果我的问题不清楚,让我知道,我可以解释更多的信息。

8gsdolmq

8gsdolmq1#

试着移动 OFFSET 以及 FETCH 外部查询的子句,如下所示:

SELECT q.productId, q.productName, q.orderId, q.orderName,
       COUNT(distinct p.productId) OVER () AS TOTAL
FROM ( SELECT * FROM product p JOIN product_sequence ps ON p.productId = ps.productId
       WHERE ps.orderId IN ('12','13','14') ) q
OFFSET 0 ROWS FETCH NEXT 100 ROWS ONLY
2uluyalo

2uluyalo2#

要在“过滤后”每页获得100行,您需要找到所有 productid 值,然后处理主查询。
例如:

select
  p.productid, p.productname, ps.orderid, ps.orderName,
  count(distinct p.productid) over() as total
from product p
join product_sequence ps on p.productid = ps.productid
where ps.orderid in ('12','13','14')
and p.productid in (
  select *
  from (
    select distinct p.productid
    from product p
    join product_sequence ps on p.productid = ps.productid
    where p.productname like '%theremin%' -- filter #1
      and ps.orderid in ('12','13','14')  -- filter #2
  ) x
  order by productid
  offset 300 rows -- get the 4th page
  fetch first 100 rows only -- page size set to 100 rows
)

参见db<>fiddle中的示例。

相关问题