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

1つのクエリで異なるパラメータを使用して複数の結合を実行する方法

    \i tmp.sql
    
    create table question
            (question_id integer not null primary key)
            ;
    INSERT INTO question(question_id) VALUES
    ( 42) , ( 10) , ( 2) , ( 36) , ( 49) ;
    
    create table question_exclusion
            ( question_type text
            , question_sub_type text
            , question_id integer REFERENCES question( question_id)
            );
    
    INSERT INTO question_exclusion(question_type, question_sub_type, question_id) VALUES
     ('A' , 'A_1' , 42 ) , ('A' , 'A_2' , 10 ) , ('B' , 'B_1' , 36  ) , ('C' , null  , 2 ) ;
    
    WITH types AS (
            select distinct question_type, question_sub_type
            FROM question_exclusion
            )
    SELECT t.question_type, t.question_sub_type, q.question_id
    FROM question q
    JOIN types t ON NOT EXISTS (
            SELECT * FROM question_exclusion x
            WHERE 1=1
            AND x.question_id = q.question_id
            AND x.question_type = t.question_type
            AND x.question_sub_type = t.question_sub_type
            )
    ORDER BY t.question_type, t.question_sub_type
            ;
    

    変更:

    WITH types AS (
            select distinct question_type, question_sub_type
            FROM question_exclusion
            )
    SELECT t.question_type, t.question_sub_type, q.question_id
    FROM question q
    CROSS JOIN types t
    WHERE NOT EXISTS (
            SELECT * FROM question_exclusion x
            WHERE 1=1
            AND x.question_id = q.question_id
            AND x.question_type = t.question_type
            AND x.question_sub_type = t.question_sub_type
            )
    ORDER BY t.question_type, t.question_sub_type
            ;
    

    と区別されない

    WITH types AS (
            select distinct question_type, question_sub_type
            FROM question_exclusion
            )
    SELECT t.question_type, t.question_sub_type, q.question_id
    FROM question q
    CROSS JOIN types t
    WHERE NOT EXISTS (
            SELECT * FROM question_exclusion x
            WHERE 1=1
            AND x.question_id = q.question_id
            AND (x.question_type, x.question_sub_type) IS NOT DISTINCT FROM
                (t.question_type, t.question_sub_type)
            )
    ORDER BY t.question_type, t.question_sub_type
            ;
    


    1. 重複キーの更新で挿入と同じ

    2. 最大限のデータ保護のための完全なMariaDB暗号化の保管中および転送中-パート2-

    3. PostgreSQLでONCONFLICTを使用してRETURNINGを使用するにはどうすればよいですか?

    4. MySQLに人間の名前を保存するというジレンマを解決し、識別可能性と類似した名前の検索の両方を維持するにはどうすればよいですか?