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

表のすべての行の中でリスト内のすべての値を照合するOracleクエリ

    Oracleセットアップ

    CREATE TABLE table_name ( ID, A, B ) AS
    SELECT 1,    'a',     'a1' FROM DUAL UNION ALL
    SELECT 2,    'b',     'b1' FROM DUAL UNION ALL
    SELECT 3,    'a',     'a2' FROM DUAL UNION ALL
    SELECT 4,    'c',     'a1' FROM DUAL UNION ALL
    SELECT 5,    'b',     'b2' FROM DUAL;
    

    クエリ-GROUP BYを使用します およびCOUNT( DISTINCT ... )

    SELECT A
    FROM   table_name
    WHERE  B IN ( 'a1', 'a2' )      -- The items in the list
    GROUP BY A
    HAVING COUNT( DISTINCT b ) = 2; -- The number of items in the list
    

    出力

    A
    -
    a
    

    クエリ-リストを動的に渡す

    CREATE OR REPLACE TYPE stringlist IS TABLE OF VARCHAR2(10);
    /
    
    SELECT A
    FROM   table_name
    WHERE  B MEMBER OF :your_list
    GROUP BY A
    HAVING COUNT( DISTINCT B ) = CARDINALITY( :your_list );
    

    バインド変数:your_listの場所 タイプはstringlist

    リストが区切り文字列として渡される場合は、区切り文字列の分割 それを分離するためのドキュメントページ。単純な PL/SQL関数 があります これにより、上記のクエリにプラグインできるコレクションとして返されます。

    更新

    SELECT A
    FROM   table_name
    GROUP BY A
    HAVING COUNT( DISTINCT CASE WHEN b IN ( 'a1', 'a2' )     THEN b END ) = 2
    AND    COUNT( DISTINCT CASE WHEN b NOT IN ( 'a1', 'a2' ) THEN b END ) = 0;
    

    または

    SELECT A
    FROM   table_name
    GROUP BY A
    HAVING COUNT( DISTINCT CASE WHEN b MEMBER OF :your_list     THEN b END ) = CARDINALITY( :your_list )
    AND    COUNT( DISTINCT CASE WHEN b NOT MEMBER OF :your_list THEN b END ) = 0;
    


    1. MySQLのバージョンを確認する方法

    2. 非常に大きなmysqlテーブルとレポート

    3. エラー:ファイルXX.csvを統計できませんでした:不明なエラー

    4. Sphider検索を私のWebサイトに追加するにはどうすればよいですか?データベースに接続できません