【问题标题】:How do I display columns from two common table expression?如何显示来自两个公用表表达式的列?
【发布时间】:2020-04-11 13:48:35
【问题描述】:

我在显示来自两个公用表表达式的列时遇到问题。我通过查询学生姓名和他们的期中成绩来创建第一个表,另一个表是学生姓名和他们的期末成绩。

  CREATE TABLE MidTerm AS (SELECT Name, Score
                           FROM GRADE
                           WHERE TYPE = ''MidTerm
  )
  CREATE TABLE FinalTerm AS (SELECT Name, Score
                           FROM GRADE
                           WHERE TYPE = 'Final'
  )

创建的两个具有相同数量的列和相同的变量。现在我想显示名称、分数“MidTerm”和分数“FinalTerm”,我该如何实现呢?我设法以仅牺牲 SELECT * 为代价使用 UNION。如果我指定

 Midterm table:

              Name : Score
               A   : 50
               B   : 60
 Finalterm table:

              Name : Score
               A   :  70
               B   :  80

我想通过显示加入 CTE 表

     Final Intended Result:
                          Name : Score "MidTerm" : Score "FinalTerm"
                           A   : 50              : 70
                           B   : 60              : 80

它会说无效的列标识符。我该如何解决?

【问题讨论】:

  • 这个不清楚。使用足够多的单词、句子和对部分示例的引用来清楚完整地表达你的意思。请在代码问题中提供minimal reproducible example--cut & paste & runnable code;具有期望和实际输出(包括逐字错误消息)的示例输入(作为初始化代码);标签和版本;明确的规范和解释。对于包含最少代码的错误,您可以给出的代码是您显示的代码可以通过您显示的代码扩展为不正常。 (调试基础。)对于包含 DBMS 和 DDL 的 SQL。请说明您可以完成目标的哪些部分。
  • 请通过编辑而不是 cmets 澄清。
  • 编辑了上面的解释
  • 仍然没有minimal reproducible example--给出确切的错误信息和代码,我们可以剪切和粘贴来导致它并编辑您的文字。在给出业务关系(船舶)/关联或表(基础或查询结果)时,说明其中的一行根据其列值说明了业务情况。当你得到一个你不期望/不理解的结果时,停止试图找到你的总体目标并找出你的误解是什么。--隔离第一个意外/误解的子表达式及其输入和输出,了解什么是误解、错字、错误的推理等导致了它。 (调试基础。)问这个。
  • 您似乎只是想要对名称进行内部连接。请 MRE。

标签: sql oracle join union


【解决方案1】:

一个简单的连接将处理这个:

SELECT m.NAME AS "Name",
       m.SCORE AS "Score MidTerm",
       f.SCORE AS "Score FinalTerm"
  FROM MIDTERM m
  LEFT OUTER JOIN FINALTERM f
    ON f.NAME = m.NAME

db<>fiddle here

【讨论】:

    【解决方案2】:

    如果根据 gordon 的回答中的评论,您有两张中期和期末成绩表,那么只需执行join,您将获得如下结果:

    Select m.name, 
           M.score as midterm_score,
           F.score as final_score
    From midterm_table m
    Join final_table f 
      on (m.name = f.name);
    

    干杯!!

    【讨论】:

      【解决方案3】:

      在这些表中添加学生的 id 并使用它来连接它们并收集您需要的列。

      我不认为创建这两个表是个好主意, 但是,好吧,我不知道你计算得分的复杂性。

      无论如何,我建议您考虑为此创建一个视图,而不是创建那些表。

      【讨论】:

        【解决方案4】:

        我很困惑。使用条件聚合:

        SELECT Name,
               MAX(CASE WHEN Type = 'MidTerm' THEN Score END) as midterm_score,
               MAX(CASE WHEN Type = 'Final' THEN Score END) as final_score,
        FROM GRADE
        GROUP BY Name;
        

        CTE 对这个查询根本没有帮助。

        您也可以使用JOIN

        select m.name, m.score as midterm_score, f.score as final_score
        from grade m join
             grade f
             on m.name = f.name and
                m.type = 'midterm' and
                f.type = 'final';
        

        请注意,这只显示names 的两个分数。

        【讨论】:

        • 我应该将第一个查询的结果(更复杂,但为了简单起见,我将上面的内容)保存到一个表(MidTerm),然后将第二个查询保存到另一个表(FinalTerm ) 随着 Where 子句中条件的变化...之后,我应该从创建的两个表中显示名称、期中分数、期末分数...
        【解决方案5】:

        我认为您只是在寻找条件聚合:

        select 
            name, 
            max(case when score = 'MidTerm' then score end) MidTerm,
            max(case when score = 'Final' then score end) Final
        from grade
        where score in ('MidTerm', 'Final')
        group by name
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-02-22
          • 1970-01-01
          • 1970-01-01
          • 2015-04-06
          • 1970-01-01
          相关资源
          最近更新 更多