代码之家  ›  专栏  ›  技术社区  ›  JPLemme

在WHERE子句中使用别名

  •  64
  • JPLemme  · 技术社区  · 17 年前

    我有一个查询,用于显示表a中最近没有更新的任何行。(每行应在“月号”后2个月内更新):

    SELECT A.identifier
         , A.name
         , TO_NUMBER(DECODE( A.month_no
                 , 1, 200803 
                 , 2, 200804 
                 , 3, 200805 
                 , 4, 200806 
                 , 5, 200807 
                 , 6, 200808 
                 , 7, 200809 
                 , 8, 200810 
                 , 9, 200811 
                 , 10, 200812 
                 , 11, 200701 
                 , 12, 200702
                 , NULL)) as MONTH_NO
         , TO_NUMBER(TO_CHAR(B.last_update_date, 'YYYYMM')) as UPD_DATE
      FROM table_a A
         , table_b B
     WHERE A.identifier = B.identifier
       AND MONTH_NO > UPD_DATE
    

    5 回复  |  直到 15 年前
        1
  •  115
  •   Community Mohan Dere    9 年前

    这不可能直接实现,因为按时间顺序,发生在哪里 选择,这始终是执行链中的最后一步。

    您可以对其进行子选择和筛选:

    SELECT * FROM
    (
      SELECT A.identifier
        , A.name
        , TO_NUMBER(DECODE( A.month_no
          , 1, 200803 
          , 2, 200804 
          , 3, 200805 
          , 4, 200806 
          , 5, 200807 
          , 6, 200808 
          , 7, 200809 
          , 8, 200810 
          , 9, 200811 
          , 10, 200812 
          , 11, 200701 
          , 12, 200702
          , NULL)) as MONTH_NO
        , TO_NUMBER(TO_CHAR(B.last_update_date, 'YYYYMM')) as UPD_DATE
      FROM table_a A
        , table_b B
      WHERE A.identifier = B.identifier
    ) AS inner_table
    WHERE 
      MONTH_NO > UPD_DATE
    

    从评论中向上移动了一些有趣的信息:

    不应该有性能上的打击。 应用外部查询之前的内部查询 Oracle将考虑的条件 将谓词向下推到内部 查询,如果是成本,则会这样做 有效的 Justin Cave

        2
  •  16
  •   wallyk    14 年前
     SELECT A.identifier
     , A.name
     , TO_NUMBER(DECODE( A.month_no
             , 1, 200803 
             , 2, 200804 
             , 3, 200805 
             , 4, 200806 
             , 5, 200807 
             , 6, 200808 
             , 7, 200809 
             , 8, 200810 
             , 9, 200811 
             , 10, 200812 
             , 11, 200701 
             , 12, 200702
             , NULL)) as MONTH_NO
     , TO_NUMBER(TO_CHAR(B.last_update_date, 'YYYYMM')) as UPD_DATE
    FROM table_a A, table_b B
    WHERE .identifier = B.identifier
    HAVING MONTH_NO > UPD_DATE
    
        3
  •  11
  •   Taryn Frank Pearson    14 年前

    HAVING

        4
  •  2
  •   J-Alex Dorota Przeniosło    9 年前

    作为一种替代方法,您可以:

    WITH inner_table AS
    (SELECT A.identifier
        , A.name
        , TO_NUMBER(DECODE( A.month_no
          , 1, 200803 
          , 2, 200804 
          , 3, 200805 
          , 4, 200806 
          , 5, 200807 
          , 6, 200808 
          , 7, 200809 
          , 8, 200810 
          , 9, 200811 
          , 10, 200812 
          , 11, 200701 
          , 12, 200702
          , NULL)) as MONTH_NO
        , TO_NUMBER(TO_CHAR(B.last_update_date, 'YYYYMM')) as UPD_DATE
      FROM table_a A
        , table_b B
      WHERE A.identifier = B.identifier)
    
        SELECT * FROM inner_table 
        WHERE MONTH_NO > UPD_DATE
    

    您还可以为队列创建一个永久视图,并从视图中选择。

    CREATE OR REPLACE VIEW_1 AS (SELECT ...);
    SELECT * FROM VIEW_1;
    
        5
  •  1
  •   Peter Aylett    8 年前

    可以有效地定义一个变量,该变量可以在SELECT、WHERE和其他子句中使用。

    SELECT A.identifier
         , A.name
         , vars.MONTH_NO
         , TO_NUMBER(TO_CHAR(B.last_update_date, 'YYYYMM')) as UPD_DATE
    FROM table_a A
         , table_b B ON A.identifier = B.identifier
    OUTER APPLY (
       SELECT
            -- variables
            MONTH_NO = TO_NUMBER(DECODE( A.month_no
                         , 1, 200803 
                         , 2, 200804 
                         , 3, 200805 
                         , 4, 200806 
                         , 5, 200807 
                         , 6, 200808 
                         , 7, 200809 
                         , 8, 200810 
                         , 9, 200811 
                         , 10, 200812 
                         , 11, 200701 
                         , 12, 200702
                         , NULL))
    ) vars
    WHERE vars.MONTH_NO > UPD_DATE
    

    荣誉 Syed Mehroz Alam