Oracle SQL头和详细信息

Oracle SQL头和详细信息,sql,oracle,Sql,Oracle,我试图创建一个标题和细节样式输出,它可以输出标题行、细节行、标题行、细节行等 它将使用两个表: 标题表: 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

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

它将使用两个表:

标题表:

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 Fiddle:

当前代码:

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:参数数无效


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

为什么在第二次选择中有两次MAIN\u NO

看起来像是打字错误


MAIN\u NO,MAIN\u DESCRIPTION,MAIN\u CUST,MAIN\u NAME,MAIN\u NO

原始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:表达式必须具有与相应表达式相同的数据类型”

我认为您只需要将头视为
主\u no
中的秩0,这样就完全避免了串联:

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 FIDLE


您可以显式地将null强制转换为预期的数据类型,但这不是必需的;为了好玩,我在CTE中使用了示例数据。

您的查询中至少存在一个问题:两个联合查询的列数不同。通常情况下,您应该为此获得ORA-01789,这样您可能会或可能不会有其他问题。。。但是我没有看到任何能触发ORA-00909的东西。因此,请先修复该问题,然后重试。这通常是通过连接表,使每行都有所有数据,并在前端进行格式化来完成的。@LoztInSpace,但在这种情况下,它必须是全部SQL@ThomasG将NULL添加到顶部联合以使其具有相同数量的字段,并且仍然得到相同的错误您已经修改了问题中的代码以修复集中问题并添加NULL(似乎…奇怪…,*8-)。如果不需要,它的别名为rnkEven,它不会导致最初的错误。工作完美!只是需要对我的数据集进行一些微调。