0

1 つのクエリで接続しようとしている 6 つのテーブルがあります。ただし、クエリの書き方がよくわかりません。

太字の表とそこに含まれる列を次に示します。

pg
pgid

ipg
ipgid ロイド
pgid

ウギッド
_

iug
iuid ロイド
ウジッド

ro
roid
inid


inid

私の目標は、 pgテーブルとuginidテーブルから特定の条件を指定してフィールドを出力することです。すべてのエントリを検索したいwhereおよび. これには多くの結合が含まれており、ステートメントで選択する人もいると思いますが、それらをすべて組み合わせる方法については十分に理解していません。inidpg.pgid=1ug.ugid=2

これが私がこれまでに持っているものです...

SELECT inid
FROM in
INNER JOIN ro  ON in.inid  = ro.inid
INNER JOIN iug ON ro.roid  = iug.roid
INNER JOIN ug  ON iug.ugid = ug.ugid
INNER JOIN ipg ON ro.roid  = ipg.roid
INNER JOIN pg  ON ipg.pgid = pg.pgid
WHERE pg.pgid = 1
  AND ug.ugid = 2
4

1 に答える 1

3

テーブルに名前を付けることはできませんin。これは、すべての SQL 標準および PostgreSQLの予約語です。しようとすると、構文エラーが発生します。名前を二重引用符で囲む と、システムに強制的に受け入れさせることができますCREATE TABLE "in" ...が、使用するたびに二重引用符で囲む必要があり、混乱するエラーメッセージが表示されます. 要するに:それをしないでください。
テーブルの名前を変更tbl_inし、クエリでエイリアスを付けました。

また、inidSELECT項目として曖昧です。USING結合条件として使用する (結果セットには1 つの列のみinidが含まれる) か、列名をテーブル修飾します。

それ以外の場合、クエリは問題ないように見えます。

SELECT i.inid    -- ambiguous without table-qualification
FROM   tbl_in i  -- renamed table
JOIN   ro  ON i.inid   = ro.inid
JOIN   iug ON ro.roid  = iug.roid
JOIN   ug  ON iug.ugid = ug.ugid
JOIN   ipg ON ro.roid  = ipg.roid
JOIN   pg  ON ipg.pgid = pg.pgid
WHERE  pg.pgid = 1
AND    ug.ugid = 2;

と の間にとと の間に外部キー制約がある場合は、次のように簡略化できます。pgipgugiug

SELECT i.inid    -- ambiguous without table-qualification
FROM   tbl_in i  -- renamed table
JOIN   ro  ON i.inid   = ro.inid
JOIN   iug ON ro.roid  = iug.roid
JOIN   ipg ON ro.roid  = ipg.roid
WHERE  ipg.pgid = 1
AND    iug.ugid = 2;

... / で見つかっiugた値は、 /にipg存在することが保証されているためです。uppg

于 2012-04-21T13:42:43.573 に答える