0
SELECT sessions_compare.*
    FROM archive_sessions as f_session, sessions_compare
    LEFT JOIN archive_sessions as s_session ON (s_session.id = sessions_compare.second_session_id)
    LEFT JOIN consols as f_consol ON (f_session.console_id = f_consol.id)

    where sessions_compare.first_session_id = f_session.id

のような get エラーを実行した後

エラー: テーブル "f_session" の FROM 節エントリへの参照が無効です 行 13:
LEFT JOIN consols as f_consol ON (f_session.console_id =...

ヒント: テーブル「f_session」のエントリがありますが、クエリのこの部分からは参照できません。

場所を切り替えてfrom好きなようにすると、次のようなsessions_compare, archive_sessions as f_session エラーが発生します

エラー: テーブル "sessions_compare" の FROM 句エントリへの参照が無効です 行 4: ... archive_sessions as s_session ON (s_session.id = sessions_c...

ヒント: テーブル「sessions_compare」のエントリがありますが、クエリのこの部分からは参照できません。

そして唯一の仕事は

SELECT sessions_compare.*
    FROM sessions_compare
    LEFT JOIN archive_sessions as s_session ON (s_session.id = sessions_compare.second_session_id)

    ,archive_sessions as f_session

    LEFT JOIN consols as f_consol ON (f_session.console_id = f_consol.id)
    where sessions_compare.first_session_id = f_session.id

そして、私の質問は正常ですか?? 必要なテーブルから複数の結合を使用する場合、MySQL の Postgresql で私は若い()

4

2 に答える 2

2

はい、これは PostgreSQL で文書化された動作です。

いずれにせよ、JOIN は FROM 項目を区切るコンマよりも強く結合します。

つまり、PostgreSQL は、FROM 句のカンマ リストを評価する前に JOIN 句を評価することによって、作業テーブルを構築するように動作します。

ベスト プラクティスは、常に JOIN 句を使用することであると一般的に考えられています。FROM 句に複数のテーブル名を入れないでください。

于 2012-04-18T10:37:09.297 に答える
2

メインクエリを JOIN に変更 (およびいくつかの相関名を追加/短縮) すると、問題が解決するようです。

DROP SCHEMA fuzz CASCADE;
CREATE SCHEMA fuzz;
SET search_path='fuzz';

create table archive_sessions ( id INTEGER NOT NULL
 , console_id INTEGER NOT NULL, game_id INTEGER NOT NULL);
create table sessions_compare (first_session_id INTEGER NOT NULL
 , second_session_id INTEGER NOT NULL);
create table consols (id INTEGER NOT NULL);
create table games (id INTEGER NOT NULL);
create table localizations ( consols_id INTEGER NOT NULL, bars_id INTEGER NOT NULL);
create table bars ( id_bars INTEGER NOT NULL, area_id INTEGER NOT NULL);
create table areas ( id_areas INTEGER NOT NULL );

SELECT sco.*
    FROM archive_sessions as ase
    JOIN sessions_compare sco ON sco.first_session_id = ase.id

    LEFT JOIN archive_sessions as ss ON (ss.id = sco.second_session_id)
    LEFT JOIN consols as sc ON (ss.console_id = sc.id)
    LEFT JOIN games as sg ON (ss.game_id = sg.id)
    LEFT JOIN localizations as sl ON (sc.id = sl.consols_id)
    LEFT JOIN bars as sb ON (sl.bars_id = sb.id_bars)
    LEFT JOIN areas as sa ON (sb.area_id = sa.id_areas)



    LEFT JOIN consols as fc ON (ase.console_id = fc.id)
    LEFT JOIN games as fg ON (ase.game_id = fg.id)
    LEFT JOIN localizations as fl ON (fc.id = fl.consols_id)
    LEFT JOIN bars as fb ON (fl.bars_id = fb.id_bars)
    LEFT JOIN areas as fa ON (fb.area_id = fa.id_areas)

    -- WHERE sco.first_session_id = ase.id
        ;
于 2012-04-18T10:27:37.557 に答える