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

余分な行を取得する-左結合を使用して3つのテーブルを結合した後

    JOINするとき 2つ以上のテーブルを一緒に使用すると、JOINでフィルターが指定されたこれらのテーブルのデカルト積を効果的に取得できます。 条件が適用されます。

    これは、廃止された暗黙のJOINを使用する場合により明白になります。 構文。

    LEFT JOIN 少ないがないことを保証します 左端のテーブルに含まれる行よりも、i。 e。左端のテーブルの各行が少なくとも1回返されます。

    フィルタが1対1の行マッピングでない場合でも、さらに多くの行を取得できます。

    あなたの場合:

    SELECT  (b.descr || ' - ' || c.descr) description
    FROM    tbl1 a
    LEFT JOIN
            tbl2 b
    ON      b.ACCOUNT = a.ACCOUNT
    LEFT JOIN
            tbl3 c
    ON      c.product = a.product
    WHERE  a.descr50 = ' '
    

    acccountのいずれか またはproduct bで一意ではありません またはc

    これらの行の場合:

    a.account
    
    1
    2
    3
    
    b.account  b.description
    
    1          Account 1
    2          Account 2 - old
    2          Account 2 - new
    

    JOIN 次を返します:

    a.account b.account b.description
    
    1         1          Account 1
    2         2          Account 2 - old
    2         2          Account 2 - new
    3         NULL       NULL
    

    、どちらのテーブルに含まれるよりも多くの行を提供します。

    いずれかのテーブルから最初に一致する説明を選択するには、次を使用します:

    SELECT  (
            SELECT  FIRST_VALUE(descr) OVER (ORDER BY descr)
            FROM    tbl2 b
            WHERE   b.account = a.account
                    AND rownum = 1
            ) || ' - ' ||
            (
            SELECT  FIRST_VALUE(descr) OVER (ORDER BY descr)
            FROM    tbl3 c
            WHERE   c.product= a.product
                    AND rownum = 1
            ) description
    FROM    tbl1 a
    WHERE   a.descr50 = ' '
    

    更新するには、クエリをインラインビューにラップするだけです:

    UPDATE  (
            SELECT  (
                    SELECT  FIRST_VALUE(descr) OVER (ORDER BY descr)
                    FROM    tbl2 b
                    WHERE   b.account = a.account
                            AND rownum = 1
                    ) || ' - ' ||
                    (
                    SELECT  FIRST_VALUE(descr) OVER (ORDER BY descr)
                    FROM    tbl3 c
                    WHERE   c.product= a.product
                            AND rownum = 1
                    ) description
            FROM    tbl1 a
            WHERE   a.descr50 = ' '
            )
    SET     descr50 = description
    


    1. JSON_REPLACE()–MySQLのJSONドキュメントの値を置き換える

    2. OSXMavericksへのRODBC/ROracleパッケージのインストール

    3. UncaughtTypeErrorはundefinedのメソッド'opendatabase'を呼び出すことができません-cordova3.5のSQLiteプラグイン

    4. OracleODP.NetおよびEFCodeFirstと連携するようにDbContextを構成するにはどうすればよいですか。