带连接的Postgresql查询

时间:2012-04-21 04:16:14

标签: sql postgresql postgresql-8.4

我有6个表,我试图在1个查询中连接在一起;但是,我无法弄清楚如何编写查询。

这是我的粗体表和它们包含的列。

PG
PGID

IPG
ipgid
固醇
PGID

UG
ugid

IUG
IUID
固醇
UGID

RO
固醇
INID


INID

我的目标是根据 pg ug 表中的某些条件输出inid字段。我想查找inidpg.pgid=1所有ug.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

1 个答案:

答案 0 :(得分:3)

您不能将表in命名为每个SQL标准和PostgreSQL中的reserved word。如果尝试,您将收到语法错误。如果你double quote the name CREATE TABLE "in" ...,你仍然可以强制系统接受它,但是你必须记住每次使用它时都要加倍引用它,你会得到令人困惑的错误信息。简而言之:不要那样做 我重命名了表tbl_in并在查询中为其指定了别名。

此外,inid与SELECT项不明确。使用USING作为连接条件(然后只有一个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;

如果您在pgipg之间以及ugiug之间有外键约束,那么您可以简化:

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中找到,就会保证up / pg中存在值。