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

Oracle SQL头和详细信息

  •  1
  • Matt  · 技术社区  · 6 年前

    我试图创建一个标题和细节样式输出,它可以输出标题行,然后是细节行,然后是标题行,然后是细节行等。

    它将使用两个表:

    头表:

    MAIN_NO MAIN_DESCRIPTION MAIN_CUST MAIN_NAME
    1       Apple            Student   John
    2       Pear             Child     Peter
    3       Orange           Alien     Matt
    

    详细信息:

    MAIN_NO PERF EVENT INFO   PREV_VALUE NEW_VALUE REV STATE MODIFIED   NOTE
    1       ABC  YES   RED    12         30        0   Con   01/02/2018 FALSE
    1       DEF  YES   BLUE   18         34        0   Con   01/04/2018 FALSE
    2       GHI  NO    BLUE   14         38        0   UUU   01/07/2018 TRUE
    2       JKL  NO    RED    11         39        0   Con   01/03/2018 FALSE
    3       MNO  NO    GREEN  19         32        0   UUU   01/01/2018 TRUE
    3       PQR  YES   WHITE  10         33        0   UUU   01/08/2018 TRUE
    

    期望输出:

    MAIN_NO MAIN_DESCRIPTION MAIN_CUST MAIN_NAME
    1       Apple            Student   John
    1       ABC  YES   RED    12         30        0   Con   01/02/2018 FALSE
    1       DEF  YES   BLUE   18         34        0   Con   01/04/2018 FALSE
    2       Pear             Child     Peter
    2       GHI  NO    BLUE   14         38        0   UUU   01/07/2018 TRUE
    2       JKL  NO    RED    11         39        0   Con   01/03/2018 FALSE
    3       Orange           Alien     Matt
    3       MNO  NO    GREEN  19         32        0   UUU   01/01/2018 TRUE
    3       PQR  YES   WHITE  10         33        0   UUU   01/08/2018 TRUE
    

    SQL小提琴: http://sqlfiddle.com/#!4/bacd0c

    当前代码:

    SELECT MAIN_NO, MAIN_DESCRIPTION, MAIN_CUST, MAIN_NAME
    FROM 
    (
        SELECT MAIN_NO, MAIN_DESCRIPTION, MAIN_CUST, MAIN_NAME, null, null, null, null, null, MAIN_NO rnk 
        FROM HeaderTable
    
        UNION ALL
    
        SELECT MAIN_NO, PERF, EVENT, INFO, PREV_VALUE, NEW_VALUE, REV, STATE, MODIFIED,   NOTE, rnk 
        FROM 
        (
            SELECT hd.*, hd.MAIN_NO || '.' || ROW_NUMBER() over (PARTITION BY hd.MAIN_NO ORDER BY hd.MAIN_NO) rnk
            FROM IFSAPP.HeaderTable h 
            INNER JOIN DetailTable hd on h.MAIN_NO= hd.MAIN_NO
        ) K     
    )p 
    ORDER BY rnk
    

    但是我得到了错误:

    ORA-00909:参数数目无效

    虽然我甚至不确定这会给我想要的输出。

    2 回复  |  直到 6 年前
        1
  •  2
  •   Alex Poole    6 年前

    原始ORA-00909错误来自 concat() ,它只接受两个参数;您有三个:

    concat(hd.MAIN_NO, '.', ROW_NUMBER() over (PARTITION BY hd.MAIN_NO ORDER BY hd.MAIN_NO))
    

    您需要嵌套调用:

    concat(concat(hd.MAIN_NO, '.'), ROW_NUMBER() over (PARTITION BY hd.MAIN_NO ORDER BY hd.MAIN_NO)))
    

    或者使用 || 操作员:

    hd.MAIN_NO || '.' || ROW_NUMBER() over (PARTITION BY hd.MAIN_NO ORDER BY hd.MAIN_NO)
    

    但是,正如评论中指出的,您还有其他问题;修复 concat 问题是“ORA-01789:查询块的结果列数不正确”错误会出现。(如在您修改过的问题中)您可以用空值来修复它,注释中也建议这样做;但是 rnk 列也有不同的类型-第一个分支使用表中的数字,第二个分支使用字符串-这将得到“ORA-01790:表达式必须具有与相应表达式相同的数据类型”。

    我想你只想把头条列为0 main_no ,这样就避免了串联:

    SELECT MAIN_NO, MAIN_DESCRIPTION, MAIN_CUST, MAIN_NAME,
      PREV_VALUE, NEW_VALUE, REV, STATE, MODIFIED, NOTE
    FROM (
        SELECT MAIN_NO, MAIN_DESCRIPTION, MAIN_CUST, MAIN_NAME,
            null as prev_value, null as new_value, null as rev, null as state,
            null as modified, null as note, 0 rnk
        FROM HeaderTable
        UNION ALL
        SELECT hd.MAIN_NO, hd.PERF, hd.EVENT, hd.INFO,
            hd.PREV_VALUE, hd.NEW_VALUE, hd.REV, hd.STATE, hd.MODIFIED, hd.NOTE,
            ROW_NUMBER() over (PARTITION BY hd.MAIN_NO ORDER BY hd.MAIN_NO) as rnk
        FROM HeaderTable h 
        INNER JOIN DetailTable hd on h.MAIN_NO= hd.MAIN_NO
    )
    ORDER BY main_no, rnk
    /
    
       MAIN_NO MAIN_D MAIN_CU MAIN_ PREV_VALUE  NEW_VALUE        REV STA MODIFIED   NOTE
    ---------- ------ ------- ----- ---------- ---------- ---------- --- ---------- -----
             1 Apple  Student John
             1 ABC    YES     RED           12         30          0 Con 01/02/2018 FALSE
             1 DEF    YES     BLUE          18         34          0 Con 01/04/2018 FALSE
             2 Pear   Child   Peter
             2 GHI    NO      BLUE          14         38          0 UUU 01/07/2018 TRUE
             2 JKL    NO      RED           11         39          0 Con 01/03/2018 FALSE
             3 Orange Alien   Matt
             3 MNO    NO      GREEN         19         32          0 UUU 01/01/2018 TRUE
             3 PQR    YES     WHITE         10         33          0 UUU 01/08/2018 TRUE
    

    我也删除了一些不必要的子查询;您需要停止一个查询 RNK公司 包含在最终结果集中。

    迟来的发现你会为数据添加一个SQL小提琴; here's the result for that .

    您可以显式地将空值强制转换为预期的数据类型,但不必这样做;只是为了好玩,我已经这样做了。 in this db<>fiddle demo ,在CTE中包含示例数据。

        2
  •  1
  •   Daniel Horvath    6 年前

    为什么有两次 主\否 在第二次选择中?

    看起来像是打字错误。

    主要客户名称 主\否