34

master親と子の複数のレベルにアイテムが格納されている1つのテーブルがあり、追加のデータがある場合とない場合がある2番目のテーブルがあります。マスターテーブルから2つのレベルをクエリし、2番目のテーブルで左結合を行う必要がありますが、クエリ内の順序が原因で、これは機能しません。

SELECT something FROM master as parent, master as child
  LEFT JOIN second as parentdata ON parent.secondary_id = parentdata.id
  LEFT JOIN second as childdata ON child.secondary_id = childdata.id
WHERE parent.id = child.parent_id AND parent.parent_id = 'rootID'

左結合はfrom句の最後のテーブルでのみ機能するため、左結合の1つでのみ機能させることができます。上記の例では、最初の左結合がfrom句の最初のテーブルを指しているため、左結合は機能しません。2番目の結合はこのようには機能しません。

どうすればこれを機能させることができますか?

4

3 に答える 3

51

JOINこの種のクエリは機能するはずです-明示的な構文で書き直した後:

SELECT something
FROM   master      parent
JOIN   master      child ON child.parent_id = parent.id
LEFT   JOIN second parentdata ON parentdata.id = parent.secondary_id
LEFT   JOIN second childdata ON childdata.id = child.secondary_id
WHERE  parent.parent_id = 'rootID'

ここでのつまずきは、JOIN「古いスタイル」の前CROSS JOINにコンマ(,)を使用して明示的にバインドすることです。ここでマニュアルを引用します:

いずれの場合も、 -list項目をJOIN区切るコンマよりも緊密にバインドされます 。FROM

最初の結合を書き直した後、すべての結合が左から右に適用され(論理的には、Postgresはクエリプラン内のテーブルを自由に再配置できます)、機能します。

私の主張を述べると、これもうまくいくでしょう:

SELECT something
FROM   master parent
LEFT   JOIN second parentdata ON parentdata.id = parent.secondary_id
,      master child
LEFT   JOIN second childdata ON childdata.id = child.secondary_id
WHERE  child.parent_id = parent.id
AND    parent.parent_id = 'rootID'

しかしJOIN、あなたのケースがもう一度説明するように、明示的な構文が一般的に好ましいです。

また、複数(LEFTJOINは行を乗算できることに注意してください。

于 2013-01-10T15:15:10.013 に答える
7

あなたはこのようにすることができます

SELECT something
FROM
    (a LEFT JOIN b ON a.a_id = b.b_id) LEFT JOIN c on a.a_aid = c.c_id
WHERE a.parent_id = 'rootID'
于 2015-04-29T14:07:36.737 に答える
3

JOINステートメントも句の一部であり、FROMより正式には、join_typeを使用して2つのfrom_itemを1つのfrom_itemに結合し、そのうちの複数の1つを。の後にコンマ区切りのリストを形成できますFROMhttp://www.postgresql.org/docs/9.1/static/sql-select.htmlを参照してください。

したがって、問題の直接的な解決策は次のとおりです。

SELECT something
FROM
    master as parent LEFT JOIN second as parentdata
        ON parent.secondary_id = parentdata.id,
    master as child LEFT JOIN second as childdata
        ON child.secondary_id = childdata.id
WHERE parent.id = child.parent_id AND parent.parent_id = 'rootID'

JOINすでに提案されているように、より良いオプションは'sのみを使用することです。

于 2013-01-10T15:35:18.600 に答える