【问题标题】:relation "table name" does not exist but it was set in FROM关系“表名”不存在,但在 FROM 中设置
【发布时间】:2019-07-28 23:05:35
【问题描述】:

我尝试在“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....

【问题讨论】:

  • 为什么所有的交叉连接?

标签: postgresql


【解决方案1】:

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

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/CROSS JOIN/... 语法重写它。问问自己交叉连接到底有什么用,是否真的需要。

【讨论】:

  • 谢谢,我没有使用 Join,因为我被要求只使用基本的 SQL。这意味着没有 WITH 也没有 JOIN。我也只是一个初学者,这是我第一次用 SQL 编写,所以可能会很乱。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-13
    • 1970-01-01
    • 1970-01-01
    • 2014-10-24
    • 2022-01-19
    • 1970-01-01
    相关资源
    最近更新 更多