如何解决Oracle 查询 - 使用 JOIN 在两个表中过滤和限制
我在 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 个条目
要求:
- (分页)在产品表中获取从 0 到 100 / 100 到 200 / 等的条目
- 用于在 UI 中显示分页的不同 productId 计数(检查下面的示例查询)
- 按“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,然后在第二个表中进行过滤以减少计数
有人可以帮我查询这个吗?任何帮助表示赞赏。
如果我的问题不清楚,请告诉我,我可以解释更多信息。
解决方法
尝试将 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
,
要“过滤后”获得每页 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','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','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 处的示例。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。