Postgresql 关系“表名”不存在,但已从中设置

Postgresql 关系“表名”不存在,但已从中设置,postgresql,Postgresql,我试图在FROM部分中使用子查询,但稍后的get errors关系表名称不存在 我试着复制粘贴我的子查询,它可以工作,但会创建非常长且难看的代码,因为我发送的只是整个问题的一部分,它代表了相同的问题 SELECT Reporter.rid , Reporter.fname , Reporter.lname FROM Reporter , report , map , keyword , ( SELECT Reporter.rid

我试图在FROM部分中使用子查询,但稍后的get errors关系表名称不存在

我试着复制粘贴我的子查询,它可以工作,但会创建非常长且难看的代码,因为我发送的只是整个问题的一部分,它代表了相同的问题

SELECT Reporter.rid , Reporter.fname , Reporter.lname
FROM Reporter , report , map , keyword , (  SELECT  Reporter.rid                                                             
                                         FROM Reporter , report , map , 
                                              keyword

                                        WHERE (Reporter.rid = report.rid  
                                               AND report.iid = map.iid 

                                                AND map.kword = 
                                                keyword.kword AND 
                                                keyword.subject <> 
                                               'health')     
                                      ) AS nonH

WHERE (Reporter.rid NOT IN(SELECT * FROM nonH) AND Reporter.rid = report.rid)
我希望这一准则能够奏效,并向我介绍所有与“健康”无关的记者

错误消息为:

错误:关系nonh不存在第7行:其中Reporter.rid不存在 从nonH和Reporter中选择*


没有名为nonH的表。您正在SELECT子句中为子查询创建nonH别名,但这不会创建具有该名称的持久对象。

您不能在这样的子查询中使用派生表。您必须为其重新重复查询:

SELECT reporter.rid,
       reporter.fname,
       reporter.lname
       FROM reporter,
            report,
            map,
            keyword,
            (SELECT reporter.rid
                    FROM reporter,
                         report,
                         map,
                         keyword
                         WHERE reporter.rid = report.rid
                               AND report.iid = map.iid
                               AND map.kword = keyword.kword
                               AND keyword.subject <> 'health') AS nonh
       WHERE reporter.rid NOT IN (SELECT reporter.rid
                                         FROM reporter,
                                              report,
                                              map,
                                              keyword
                                              WHERE reporter.rid = report.rid
                                                    AND report.iid = map.iid
                                                    AND map.kword = keyword.kword
                                                    AND keyword.subject <> 'health')
             AND reporter.rid = report.rid);
也可以使用通用表表达式:

WITH
nonh
AS
(
SELECT reporter.rid
       FROM reporter,
            report,
            map,
            keyword
            WHERE reporter.rid = report.rid
                  AND report.iid = map.iid
                  AND map.kword = keyword.kword
                  AND keyword.subject <> 'health'
)
SELECT reporter.rid,
       reporter.fname,
       reporter.lname
       FROM reporter,
            report,
            map,
            keyword,
            nonh
       WHERE reporter.rid NOT IN (SELECT rid
                                         FROM nonh)
             AND reporter.rid = report.rid);

这可能会解决你眼前的问题。但老实说,您查询的表的所有隐式连接都非常混乱,这些表的列从未被使用过,也很难理解,更不用说猜测您可能要查询什么了。我建议您使用显式内部联接/交叉联接/重写它。。。语法。然后问问自己交叉连接到底有什么好处,是否真的需要它们。

为什么要使用所有交叉连接?谢谢,我没有使用连接,因为我被要求只使用SQL的基本功能。这意味着没有,也没有加入。我也是一个初学者,这是我第一次用SQL编写,所以可能会比较混乱。