2012-04-21 85 views
0

我有6个表,我试图在1个查询中连接在一起;但是,我不能完全弄清楚如何编写查询。带连接的Postgresql查询

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

PG
PGID

IPG
ipgid
ROID
PGID

微克
UGID

IUG
IUID
固醇
UGID

RO
固醇
INID


INID

我的目标是输出inid字段给出了来自ug表的某些标准。我想查找所有inid条目,其中pg.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 
+0

你没有得到你要找的结果吗?顺便说一句,我认为'pg'的加入可能不需要;它只会在没有'pgid = 1'的情况下过滤结果。 – 2012-04-21 04:24:32

+1

你有什么错误? – vyegorov 2012-04-21 08:01:31

回答

3

你不能说出你的表in,即在每一个SQL标准和PostgreSQL中reserved word。如果你尝试,你会得到一个语法错误。如果您使用double quote the nameCREATE 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中。

+0

就像你说的Erwin那样工作。我不得不改变一些表名,因为它们太长了,我想保持简单。我没有意识到我创建了一个IN表名。查询现在完美谢谢。 – jsmithy 2012-04-24 13:15:43