2010-03-28 14 views
6

truy vấn này nhận được tập hợp thống trị trong mạng. ví dụ như vậy cho một mạng lướiLàm thế nào tôi có thể loại bỏ 'ORA-01489: kết quả của chuỗi nối quá dài' trong truy vấn này?

A<----->B
B<----->C
B<----->D
C<----->E
D<----->C
D<----->E
F<----->E

nó trả
B, E
B, F
A, E
nhưng nó không hoạt động cho dữ liệu lớn, vì tôi đang sử dụng phương pháp chuỗi trong kết quả của tôi. tôi đã cố gắng để loại bỏ các phương pháp chuỗi và trả về một quan điểm hay một cái gì đó nhưng không có kết quả

With t as (select 'A' as per1, 'B' as per2 from dual union all 
     select 'B','C' from dual union all 
     select 'B','D' from dual union all 
     select 'C','B' from dual union all 
     select 'C','E' from dual union all 
     select 'D','C' from dual union all 
     select 'D','E' from dual union all 
     select 'E','C' from dual union all 
     select 'E','D' from dual union all 
     select 'F','E' from dual) 
,t2 as (select distinct least(per1, per2) as per1, greatest(per1, per2) as per2 from t union 
     select distinct greatest(per1, per2) as per1, least(per1, per2) as per1 from t) 
,t3 as (select per1, per2, row_number() over (partition by per1 order by per2) as rn from t2) 
,people as (select per, row_number() over (order by per) rn 
      from (select distinct per1 as per from t union 
        select distinct per2 from t) 
      ) 
    ,comb as (select sys_connect_by_path(per,',')||',' as p 
       from people 
       connect by rn > prior rn 
      ) 
    ,find as (select p, per2, count(*) over (partition by p) as cnt 
      from (
        select distinct comb.p, t3.per2 
        from comb, t3 
        where instr(comb.p, ','||t3.per1||',') > 0 or instr(comb.p, ','||t3.per2||',') > 0 
       ) 
      ) 
,rnk as (select p, rank() over (order by length(p)) as rnk 
      from find 
      where cnt = (select count(*) from people) 
      order by rnk 
     ) select distinct trim(',' from p) as p from rnk where rnk.rnk = 1` 

Trả lời

0

Theo kinh nghiệm của tôi bạn không muốn làm chuỗi phức tạp xử lý trong, truy vấn phức tạp lớn, và truy vấn này là khá phức tạp . Tôi đoán rằng vấn đề này rất tốt có thể được hưởng lợi từ một suy nghĩ lại và một cách tiếp cận khác hơn là tối ưu hóa truy vấn hiện có.

Các bảng cơ bản trông như thế nào và bạn đang cố đạt được những gì chính xác? Có thể thay đổi mô hình dữ liệu không?

+0

Dữ liệu A <---> B, B <---> C ...., được hiển thị ở trên là dữ liệu cơ bản. chúng đại diện cho một dạng quan hệ người dùng và bạn bè. Tôi đang cố gắng tìm tập hợp tối thiểu trong mạng này Tập hợp tối thiểu, trong một mạng xã hội, là tập hợp những người bạn chung với mọi người trong mạng Thông tin thêm về thống trị đặt tại đây : http: //en.wikipedia.org/wiki/Dominating_set –

6

Một trong những giới hạn của Oracle là SQL không thể xử lý VARCHAR2 lớn hơn 4000 ký tự. Nếu bạn cố gắng trả về một chuỗi vượt quá kích thước này, nó sẽ làm hỏng ORA-01489. Lý tưởng nhất là bạn nên cố gắng chia kết quả thành nhiều hàng nhỏ. Hoặc bạn có thể trả lại nó như một CLOB.

chỉnh sửa

làm thế nào tôi có thể trở lại bên trên như một CLOB

Hmm ...

Sau khi nhìn kỹ vào mã của bạn tôi nghĩ rằng nơi duy nhất mà là có để ném ORA-1489 là dòng này:

select sys_connect_by_path(per,',')||',' as p 
from people 

Thật dễ dàng để kết thúc cuộc gọi đó trong TO_CLOB(). Thật không may, việc chuyển P thành CLOB sẽ phá vỡ một số xử lý tiếp theo ('phân biệt p , phân vùng bằng p`) để nó có thể không phải là một tùy chọn. Lấy làm tiếc.

Đối với các cách giải quyết khác ....

Trang web của bạn có giấy phép cho Oracle Spatial không? Tôi biết không có nhiều trang web làm, nhưng nếu bạn là một trong những người may mắn (và bạn đang sử dụng 10gR2 hoặc cao hơn) thì bạn nên kiểm tra Oracle Spatial Network Data Model (PDF).

Nếu không, nếu không có cách nào để hạn chế đầu ra của cuộc gọi sys_connect_by_path(), bạn có thể chỉ cần thực hiện điều này trong PL/SQL. Bạn có thể sử dụng một số PIPELINED FUNCTION để trả lại kết quả cuối cùng để bạn vẫn có thể gọi nó từ một câu lệnh SELECT.

+0

CLOB ?, cách tôi có thể trả về ở trên như một CLOB. vui lòng giải thích thêm –

+0

+1 cho "hurl ORA-1489" – EvilTeach

Các vấn đề liên quan