0

我有 6 个表要在 1 个查询中连接在一起;但是,我不太清楚如何编写查询。

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

pg
pgid

ipg
ipgid
机器人
pgid

呃呃
呃呃

iug
iuid 机器人
ugid

机器人inid
_


inid

我的目标是从pgug表中输出inid给定特定条件的字段。我想找到所有条目在哪里和。这涉及到很多连接,我认为在陈述中有一些选择,但我对如何将它们拼凑在一起还不够熟悉。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

您不能命名您的 table in,这是每个 SQL 标准和 PostgreSQL 中的保留字。如果你尝试,你会得到一个语法错误。如果您双引号该名称 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;

如果在 and 和 and 之间有外键约束,那么你可以简化: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中找到值,就保证会出现在up/中pg

于 2012-04-21T13:42:43.573 回答