sql >> データベース >  >> RDS >> Oracle

SQLでタプルのグループを比較する方法

    このようなもの

    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
    /
    

    各グループの個別の値の最小値、最大値、および数に基づいて予備的な削除を行いました。これは、大規模なデータセットに役立ちます。データセットが十分に小さい場合は、必要ない場合があります。

    それはあなたに試合を教えてくれます。一致するものがないグループを見つけるには、追加の手順を実行する必要があります

    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. スペースを含むOracleテーブルの列名

    2. aspサーバーエラー'ファイルまたはアセンブリを読み込めませんでした'が、アセンブリは確実に存在します。

    3. MySQLの主キー

    4. 更新時のSQLエラー:UPDATEステートメントがFOREIGNKEY制約と競合していました