我有6个表,我试图在1个查询中连接在一起;但是,我无法弄清楚如何编写查询。
这是我的粗体表和它们包含的列。
PG
PGID
IPG
ipgid
固醇
PGID
UG
ugid
IUG
IUID
固醇
UGID
RO
固醇
INID
在
INID
我的目标是根据 pg 和 ug 表中的某些条件输出inid
字段。我想查找inid
和pg.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
答案 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;
如果您在pg
和ipg
之间以及ug
和iug
之间有外键约束,那么您可以简化:
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
中存在值。