【问题标题】:Oracle Query - Filter and Limit in two tables using JOINOracle 查询 - 使用 JOIN 在两个表中过滤和限制
【发布时间】:2021-04-27 12:36:13
【问题描述】:

我在 Oracle Query 中遇到了一个问题,以实现以下用例,

假设我有两张桌子:

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

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

product 表有 1000 个条目,product_sequence 表有 10K 个条目

要求

  1. (分页)在产品表中获取从 0 到 100 / 100 到 200 / 等的条目
  2. 用于在 UI 中显示分页的 productId 的不同计数(请查看下面的示例查询)
  3. 按“product”表中的“productName”和“product_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_sequence' 表中映射条目

实际: 它首先在产品中限制 100 个条目,然后过滤 orderId,以便返回的条目数从 100 减少到更少 我同意我的查询不正确:它首先在子查询的“产品”表中限制为 100,然后在第二个表中进行过滤以减少计数

有人可以帮我解决这个问题吗?任何帮助表示赞赏。
如果我的问题不清楚,请告诉我,我可以提供更多信息。

【问题讨论】:

  • 没有排序的分页没有什么意义。

标签: java sql oracle sql-query-store


【解决方案1】:

尝试将OFFSETFETCH 子句移至外部查询,如下所示:

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

【讨论】:

    【解决方案2】:

    要在“过滤后”获得每页 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 的示例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-09
      • 1970-01-01
      • 2018-03-29
      • 2016-09-19
      • 2011-03-25
      • 1970-01-01
      • 2010-09-14
      相关资源
      最近更新 更多