关系“表名”不存在,但已在FROM

时间:2019-07-28 14:24:54

标签: postgresql

我正在尝试在“ FROM”部分中使用子查询,但稍后收到错误消息“关系“表名”不存在”。

我试图复制粘贴我的子查询,该子查询虽然有效,但是却创建了非常冗长且丑陋的代码,因为我发送的内容只是表示相同问题的全部内容的一部分。

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行:WHERE(Reporter.rid NOT   IN(SELECT * FROM nonH)AND Reporter ....

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

patron=re.compile(r'\n\{*\\small\{(?P<texto>.*?)\}+', re.S)

或者您可以使用公用表表达式:

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); / INNER JOIN / ...语法重写它。并问自己,交叉连接实际上有什么用处,以及是否确实需要它们。