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

外部キー列がNULLになる可能性がある場所のクエリ

    「uidの行がまったくない」場合、JOIN あなたと同じように、行がない 結果として。 LEFT [OUTER] JOIN 代わりに:

    SELECT u.uid, u.fname, u.lname
    FROM   u 
    LEFT   JOIN u_org o ON u.uid = o.uid 
    LEFT   JOIN login l ON u.uid = l.uid 
    WHERE (o.orgid = 2 OR o.orgid IS NULL)
    AND    l.access IS DISTINCT FROM 4;
    

    また、演算子の優先順位 。 (AND ORの前にバインドします 。

    IS DISTINCT FROMを使用しています !=の代わりに 最後のWHERE条件では、ここでもlogin.access NULLの可能性があります 、これは対象外です。

    ただし、テーブルuの列にのみ関心があるようです。 まず、この代替クエリはより洗練されたものになります:

    SELECT u.uid, u.fname, u.lname
    FROM   u
    WHERE (u.uid IS NULL OR EXISTS (
       SELECT 1
       FROM   u_org o
       WHERE  o.uid = u.uid
       AND    o.orgid = 2
       ))
    AND NOT EXISTS (
       SELECT 1
       FROM   login l
       WHERE  l.uid = u.uid
       AND    l.access = 4
       );
    

    この代替手段には、常に1つを取得できるという追加の利点があります。 uからの行 、u_orgに複数の行がある場合でも またはlogin




    1. MySQL Insert Into Select

    2. セーフティネット

    3. テーブルの言語翻訳

    4. ECONNREFUSEDを接続します-ノードjs、sql