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,它不会导致最初的错误。工作完美!只是需要对我的数据集进行一些微调。