Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Cách so sánh các nhóm bộ giá trị trong sql

Một cái gì đó như thế này

create table t1 (group_id varchar2(20), value varchar2(20));
create table t2 (group_id varchar2(20), value varchar2(20));

insert into t1 values ('A','FOO');
insert into t1 values ('A','BAR');
insert into t1 values ('X','HHH');
insert into t1 values ('X','ZOO');
insert into t2 values ('C','FOO');
insert into t2 values ('C','BAR');
insert into t2 values ('B','ZOO');


select t1.group_id t1_group,t2.group_id t2_group, 
      --t1.all_val, t2.all_val, 
       case when t1.all_val = t2.all_val then 'match' else 'no match' end coll_match
from 
  (select 'T1' tab_id, group_id, collect(value) all_val, 
          min(value) min_val, max(value) max_val, count(distinct value) cnt_val 
  from t1 group by group_id) t1
full outer join
  (select 'T2' tab_id, group_id, collect(value) all_val, 
          min(value) min_val, max(value) max_val, count(distinct value) cnt_val 
  from t2 group by group_id) t2
on t1.min_val = t2.min_val and t1.max_val = t2.max_val and t1.cnt_val = t2.cnt_val
/

Tôi đã thực hiện loại bỏ sơ bộ dựa trên giá trị tối thiểu, tối đa và số lượng các giá trị riêng biệt trong mỗi nhóm, điều này sẽ giúp ích cho các tập dữ liệu lớn. Nếu bộ dữ liệu đủ nhỏ, bạn có thể không cần chúng.

Điều đó cho bạn biết các trận đấu. Bạn chỉ cần đẩy nó ra một bước bổ sung để tìm các nhóm không có bất kỳ kết quả phù hợp nào

select t1_group
from
(
  select t1.group_id t1_group,t2.group_id t2_group, 
        --t1.all_val, t2.all_val, 
         case when t1.all_val = t2.all_val then 'match' end coll_match
  from 
    (select 'T1' tab_id, group_id, collect(value) all_val
    from t1 group by group_id) t1
  cross join
    (select 'T2' tab_id, group_id, collect(value) all_val
    from t2 group by group_id) t2
)
group by t1_group
having min(coll_match) is null
/

select t2_group
from
(
  select t1.group_id t1_group,t2.group_id t2_group, 
        --t1.all_val, t2.all_val, 
         case when t1.all_val = t2.all_val then 'match' end coll_match
  from 
    (select 'T1' tab_id, group_id, collect(value) all_val
    from t1 group by group_id) t1
  cross join
    (select 'T2' tab_id, group_id, collect(value) all_val
    from t2 group by group_id) t2
)
group by t2_group
having min(coll_match) is null
/


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Truy vấn SQL để tìm các hàng có ít nhất một trong các giá trị được chỉ định

  2. Bắt đầu với Oracle Application Express-APEX

  3. Làm thế nào để kết hợp hai bảng thành các cột giống nhau này?

  4. Tìm kiếm các giá trị NULL cho các loại Oracle khác nhau

  5. Các chức năng của cửa sổ SORT tốn kém, chúng ta có thể khắc phục được không?