【问题标题】:SQL subquery inside FROM and WHERE classFROM 和 WHERE 类中的 SQL 子查询
【发布时间】:2021-08-23 20:10:39
【问题描述】:

你能帮我理解为什么下面的代码不起作用吗?

基本上,有两个表 - Economies 和 Countries。从Countries 表中,我需要找到不是君主立宪制或共和国的国家代码列表。

然后使用这些代码,我需要使用上述标准从经济体中提取通货膨胀率和失业率参数。

这是我的 SQL 代码:

SELECT 
    e.code, e.inflation_rate, e.unemployment_rate, subquery.gov_form
FROM
    ECONOMIES e,
    (SELECT code, gov_form
     FROM countries
     WHERE gov_form NOT IN ('Constitutional Monarchy', 'Republic')         
    ) AS subquery
WHERE 
    year = 2015 
    AND code IN (SELECT code FROM subquery)

在第 9 行,我得到一个错误

关系子查询不存在

我知道这可以使用 JOINS 来执行,但我想了解为什么这段代码不起作用。

谢谢!

【问题讨论】:

    标签: sql join subquery


    【解决方案1】:

    我不知道你想做什么有用的事情。但是,您的 语法 问题出现了,因为您将子查询与 CTE、表和视图混淆了。后者都可以在一个查询中被多次引用。

    所以,你似乎想要:

    WITH subquery AS (
          SELECT code, gov_form
          FROM countries
          WHERE gov_form NOT IN ('Constitutional Monarchy','Republic' )  
         )
    SELECT e.code, e.inflation_rate, e.unemployment_rate, subquery.gov_form
    FROM ECONOMIES e CROSS JOIN
         subquery
    WHERE year = 2015 AND
          e.code IN (SELECT s.code FROM subquery s);
    

    不过,我怀疑你只是想要JOIN:

    SELECT e.code, e.inflation_rate, e.unemployment_rate, c.gov_form
    FROM ECONOMIES e JOIN
         countries c
         ON e.code = c.code
    WHERE year = 2015 AND
           c.gov_form NOT IN ('Constitutional Monarchy', 'Republic');
    

    至少,这样做是明智的。

    【讨论】:

      【解决方案2】:

      您正在尝试从子查询中进行选择,该子查询不是表,而是查询生成的关系。修复:

      SELECT 
          e.code, e.inflation_rate, e.unemployment_rate, subquery.gov_form
      FROM
          ECONOMIES e,
          JOIN (SELECT code, gov_form
           FROM countries
           WHERE gov_form NOT IN ('Constitutional Monarchy', 'Republic')         
          ) AS subquery
          ON e.year = subquery.year AND year = 2015 AND
          e.code = subquery.code
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-03
        • 1970-01-01
        • 1970-01-01
        • 2011-12-03
        相关资源
        最近更新 更多