首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >关于connect by prior查询的帮助

关于connect by prior查询的帮助
EN

Stack Overflow用户
提问于 2011-03-23 01:32:14
回答 2查看 2.2K关注 0票数 3

我有以下数据

代码语言:javascript
运行
复制
Order_ID  Pallet_ID
O1        P1
O2        P1
O2        P2
O3        P2
O3        P3
O4        P4

其中订单可以在多个托盘上,并且一个托盘上可以有多个订单。我需要选择组成一个组的订单组,因为它们都共享同一组托盘。在上面的测试数据中,有两个这样的组,{O1,O2,O3}和{O4},因为O1,O2和O3至少有一个托盘与组中的另一个成员相同。

现在我需要一些SQL来做这件事。我尝试过(其中greg_test包含上面的数据)

代码语言:javascript
运行
复制
select distinct order_id
from greg_test
start with order_id = :order_id
connect by pallet_id = prior pallet_id

但这给了我一个循环引用错误(用户数据中的ORA-01436 CONNECT BY循环)。添加nocycle没有给出正确的集合。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-23 12:47:49

该查询只使用一次全表扫描,如果有索引,也可以使用索引范围扫描。

代码语言:javascript
运行
复制
select distinct order_id
from greg_test
start with order_id = :order_id
connect by nocycle pallet_id = prior pallet_id or order_id = prior order_id;

如果你使用的是11gR2,它的运行速度会比上面的connect by query快一点,尽管它的语法更加奇怪。

代码语言:javascript
运行
复制
with orders(order_id, pallet_id) as
(
    select order_id, pallet_id
    from greg_test
    where order_id = :order_id
    union all
    select greg_test.order_id, greg_test.pallet_id
    from greg_test
    inner join orders
        on greg_test.pallet_id = orders.pallet_id
            or greg_test.pallet_id = orders.pallet_id
) cycle order_id, pallet_id set is_cycle to 'Y' default 'N'
select distinct order_id from orders;

如果您有大量的数据,您将希望彻底测试您使用的任何解决方案。分层查询通常具有严重的性能问题。

票数 2
EN

Stack Overflow用户

发布于 2011-03-23 05:50:07

代码语言:javascript
运行
复制
-- Z lists all order pairs that share a pallet, and also pairs each order with itself
WITH pairs AS (
    -- all pairs of orders on the same pallet
    SELECT DISTINCT a.order_id a, b.order_id b FROM greg_test a, greg_test b 
    WHERE a.pallet_id = b.pallet_id AND a.order_id != b.order_id
  UNION ALL 
    -- pair all orders with themselves
    SELECT DISTINCT order_id a, order_id b FROM greg_test
)
-- Now connect all the pairs
SELECT DISTINCT a FROM pairs 
CONNECT BY NOCYCLE PRIOR a = b 
START WITH a = :order_id

也许有一个更有效的解决方案。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5395425

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档