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

結合内の重複フィールドを除外する

    SQLには列除外構文はなく、列包含構文のみがあります(すべての列に対して*演算子を使用するか、列名を明示的にリストします)。

    必要な列のみのリストを生成する

    ただし、スキーマテーブルとデータベースのいくつかの組み込み関数を使用して、数百の列名から不要な重複列を除いたSQLステートメントを生成できます。

    SELECT
        'SELECT sampledata.c1, sampledata.c2, ' || ARRAY_TO_STRING(ARRAY(
            SELECT 'demographics' || '.' || column_name
            FROM information_schema.columns
            WHERE table_name = 'demographics' 
            AND column_name NOT IN ('zip')
            UNION ALL
            SELECT 'community' || '.' || column_name
            FROM information_schema.columns
            WHERE table_name = 'community' 
            AND column_name NOT IN ('fips')
        ), ',') || ' FROM sampledata JOIN demographics USING (zip) JOIN community USING (fips)'
    AS statement
    

    これはステートメントを出力するだけで、実行はしません。次に、結果をコピーして実行します。

    ステートメントの生成と動的な実行の両方を一度に行う場合は、PostgreSQLドキュメント

    列名にテーブル名を付加する

    または、重複データを含むすべての列の選択リストを生成しますが、各列のテーブル名も含めるようにエイリアスを作成します。

    SELECT
        'SELECT ' || ARRAY_TO_STRING(ARRAY(
            SELECT table_name || '.' || column_name || ' AS ' || table_name || '_' || column_name
            FROM information_schema.columns
            WHERE table_name in ('sampledata', 'demographics', 'community')
        ), ',') || ' FROM sampledata JOIN demographics USING (zip) JOIN community USING (fips)'
    AS statement
    

    繰り返しますが、これはステートメントを生成するだけです。ステートメントの生成と動的な実行の両方を行う場合は、データベースの動的SQL実行をブラッシュアップする必要があります。それ以外の場合は、結果をコピーして実行するだけです。

    列エイリアスにドット区切り文字が本当に必要な場合は、SELECT table_name || '.' || column_name || ' AS "' || table_name || '.' || column_name || '"' 。ただし、二重引用符で囲まれたエイリアスは、余分な複雑さ(大文字と小文字の区別など)を引き起こす可能性があります。そのため、代わりにアンダースコア文字を使用して、エイリアス内の列名からテーブル名を分離しました。そうすれば、エイリアスを通常の列名と同じように扱うことができます。




    1. データベースフィールドを上書きする代わりに追加する(MySQL UPDATE関数)

    2. mysql WHERE MATCH AGAINST

    3. SQLでテーブルの最後のレコードを選択するにはどうすればよいですか?

    4. Laravel-記事のタイトルからユニークなスラッグを適切に生成する方法は?