【问题标题】:SQL Assignment about joining tables关于连接表的 SQL 赋值
【发布时间】:2016-04-14 18:59:46
【问题描述】:

我正在 Oracle 中处理 SQL 任务。有两张表。

table1 被称为 Person10:

字段包括:ID、Fname、Lname、State、DOH、JobTitle、Salary、Cat。

table2 被称为 StateInfo:

字段包括:State、Statename、Capital、Nickname、Pop2010、pop2000、pop1990、sqmiles。

问题:

创建一个名为 A10T2 的视图,该视图将显示在 Person10 表中至少有 25 人且 Cat 值为 N 且年薪在 75,000 美元到 125,000 美元之间的州的州名、首都和昵称。三列标题应为 StateName、Capital 和 Nickname。行应按州名排序。

我有什么:

CREATE VIEW A10T2 AS
SELECT StateName, Capital, Nickname
FROM STATEINFO INNER JOIN PERSON10 ON
     STATEINFO.STATE = PERSON10.STATE
WHERE Person10.CAT = 'N' AND 
      Person10.Salary in BETWEEN (75000 AND 125000) AND 
      count(Person10.CAT) >= 25
ORDER BY STATE;

它给了我一个错误,说缺少表达式。我可能需要一个集体表达......但我不知道我做错了什么。

【问题讨论】:

  • 你能把详细的错误信息贴出来吗?

标签: sql oracle inner-join


【解决方案1】:

是的,当我第一次回答这个问题时,我最初把它搞砸了,因为它是在进行中的,我没有机会测试我放下了什么。我忘了使用 GROUP BY 更适合聚合函数(如选择中的 SUM、AVG 和 COUNT),这可能就是它抛出错误的原因。在这种情况下,使用 ORDER BY 可能是正确的选择。并且您想按州对结果进行排序,以便使用 StateName。

SELECT S.StateName, S.Capital, S.Nickname
FROM STATEINFO S
INNER JOIN PERSON10 P ON S.STATE = P.STATE
WHERE P.CAT = 'N' 
AND P.Salary BETWEEN 75000 AND 125000 
ORDER BY S.StateName
HAVING count(P.CAT) >= 25;

【讨论】:

  • 嗨。感谢您的解决方案,但我仍然收到一条错误消息,提示“不是 GROUP BY 表达式”
  • 如果您稍微解释一下,这将是一个更好的答案。仅包含代码的答案通常对其他用户没有帮助。
  • Ehh.. 仍然给我错误:“not a group by expression”
  • 对不起,我忘了使用 GROUP BY 通常与选择中的 A​​VG 或 SUM 等聚合函数有关。这应该是它抛出错误的原因,因此使用 ORDER BY S.StateName 应该可以工作。如果您仍然遇到问题,请告诉我,因为我试图在没有测试的情况下即时执行此操作,但我意识到这不是一个好主意。
【解决方案2】:

尝试将您的 count() 移动到 HAVING 而不是 WHERE。您还需要一个包含 StateName、Capital 和 Nickname 的 GROUP BY 子句。

我知道这个链接是 Microsoft,而不是 Oracle,但它应该会有所帮助。

https://msdn.microsoft.com/en-us/library/ms180199.aspx?f=255&MSPPError=-2147217396

【讨论】:

    【解决方案3】:

    我不是 Oracle 专家,但我很确定

    Person10.Salary in BETWEEN (75000 AND 125000)
    

    应该是

    Person10.Salary BETWEEN 75000 AND 125000
    

    (没有IN,也没有括号)。这就是我所知道的所有其他 SQL 方言的工作方式。

    另外,将COUNT()WHERE 子句移动到HAVING 子句:

    CREATE VIEW A10T2 AS
    SELECT StateName, Capital, Nickname
    FROM STATEINFO INNER JOIN PERSON10 ON
         STATEINFO.STATE = PERSON10.STATE
    WHERE Person10.CAT = 'N' AND 
          Person10.Salary BETWEEN 75000 AND 125000
    ORDER BY STATE
    HAVING count(Person10.CAT) >= 25;
    

    【讨论】:

      【解决方案4】:

      您可以尝试使用这样的子查询。

      CREATE VIEW A10T2 AS
      SELECT statename, capital, nickname
      FROM stateinfo
      WHERE statename IN (SELECT statename 
                          FROM person10 
                          WHERE Cat = 'N'
                          AND Salary BETWEEN 75000 AND 125000
                          GROUP BY statename
                          HAVING COUNT(*) >= 25)
      ORDER BY statename
      

      【讨论】:

      • 非常感谢。我从没想过这可以通过嵌套的 select 语句来完成。
      • 嗨@AyazAmir,如果这个或任何答案解决了您的问题,请点击复选标记考虑accepting it。这向更广泛的社区表明您已经找到了解决方案,并为回答者和您自己提供了一些声誉。没有义务这样做。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-01
      • 2011-06-10
      • 1970-01-01
      • 1970-01-01
      • 2023-02-21
      • 2014-06-26
      • 2023-03-14
      相关资源
      最近更新 更多