首页 > 解决方案 > 我需要从表中已检索到的列中检索一列

问题描述

我有一个表,它有一个这样的列,我从这个查询中检索到

select distinct HDD_WP_RPTNG_AS_OF_SID
from wcadbo.WCA_MDW_D_HLDNGS_DATE 
order by HDD_WP_RPTNG_AS_OF_SID desc;

桌子:

HDD_WP_RPTNG_AS_OF_SID
20210501
20210430
20210429
20210428

它包含整数格式的日期。

我写了一个查询以日期格式检索这些日期的另一列,并将列命名为AS_OF_DATE- 如下所示:

SELECT DISTINCT
    HDD_WP_RPTNG_AS_OF_SID,
    to_date(HDD_WP_RPTNG_AS_OF_SID,'YYYYMMDD') AS_OF_DATE
FROM
    WCADBO.WCA_MDW_D_HLDNGS_DATE
ORDER BY
    HDD_WP_RPTNG_AS_OF_SID DESC;

结果集:

HDD_WP_RPTNG_AS_OF_SID  AS_OF_DATE
----------------------------------
20210501    01-MAY-21
20210430    30-APR-21
20210429    29-APR-21
20210428    28-APR-21

现在我需要另一列作为 char 类型的 Display_Date,它为上一列中的最新日期提供 LastAvailableDate,或者为所有其他日期提供 char 类型的 Date

我写了这个查询但没有工作:

SELECT 
    HDD_WP_RPTNG_AS_OF_SID,
    AS_OF_DATE,
    Display_date
FROM
    (SELECT DISTINCT
         HDD_WP_RPTNG_AS_OF_SID,
         to_date(HDD_WP_RPTNG_AS_OF_SID,'YYYYMMDD') AS_OF_DATE  
     FROM
         WCADBO.WCA_MDW_D_HLDNGS_DATE
     ORDER BY
         HDD_WP_RPTNG_AS_OF_SID DESC)
WHERE
    Display_Date = (CASE
                        WHEN AS_OF_DATE = '01-MAY-21' 
                            THEN 'Last_Available_date'
                            ELSE TO_CHAR(AS_OF_DATE, 'MON DD YYYY')
                    END);

最后我需要三列,一列已经在表中,但做了一些修改。其他两个是我需要检索的临时的(AS_OF_DATE 和 Display_Date)。

我是 SQL 的初学者,不知道如何从另一个临时列中检索列..

请帮忙,谢谢。

顺便说一句,我是在 Oracle SQL Developer 中做的

标签: sqloracle

解决方案


看起来你想要这样的东西

SELECT 
    subQ.HDD_WP_RPTNG_AS_OF_SID,
    subQ.AS_OF_DATE,
    (CASE
          WHEN subQ.AS_OF_DATE = date '2021-05-01'
          THEN 'Last_Available_date'
          ELSE TO_CHAR(subQ.AS_OF_DATE, 'MON DD YYYY')
      END) Display_date
FROM
    (SELECT DISTINCT
         tbl.HDD_WP_RPTNG_AS_OF_SID,
         to_date(tbl.HDD_WP_RPTNG_AS_OF_SID,'YYYYMMDD') AS_OF_DATE  
     FROM
         WCADBO.WCA_MDW_D_HLDNGS_DATE tbl) subQ
ORDER BY
      subQ.HDD_WP_RPTNG_AS_OF_SID DESC

注释

  • 如果要添加计算列,则在投影(select列表)中完成
  • 始终将日期与日期进行比较,将字符串与字符串进行比较。因此,在您的case声明中,将date as_of_date日期与另一个日期进行比较。在这种情况下,我使用的是日期文字。您还可以调用to_date字符串参数。
  • 如果您希望查询结果按特定列排序,则希望将其order by应用于查询的最外层,而不是在内联视图中。
  • 在引用查询中的任何列时,您基本上总是希望使用别名。在所有内容都来自一个表的情况下,它的重要性不那么重要,但是一旦您开始在查询中引用多个表,查看查询并且不确定列的来源会变得很烦人。即使在这样的查询中,有一个内联视图和一个外部查询,如果您明确说明列的来源,它也可以更容易地阅读查询。
  • 真的需要distinct吗?我保留了它,因为它是原始查询的一部分,但每当我看到distinct学习 SQL 的人的特别之处时,我都会感到不安。执行 adistinct是一项相对昂贵的操作,它通常用于掩盖查询中的潜在问题(即您得到多行,因为您未显示的其他列具有多个值)应该正确解决(即通过添加一个额外的谓词来确保你只得到hdd_wp_rptg_as_of_sid一次)。
  • 将日期作为字符串存储在表格中(显然是用 来完成的hdd_wp_rptg_as_of_sid)是一种非常糟糕的做法。例如,如果有人在字符串格式不正确的表中写入一行,您的查询将突然停止工作并开始抛出错误。

推荐阅读