SQL Plus 格式化嵌套表列
Posted
技术标签:
【中文标题】SQL Plus 格式化嵌套表列【英文标题】:SQL Plus formatting a nested table column 【发布时间】:2021-05-05 17:29:38 【问题描述】:我在显示嵌套表列数据时遇到问题,因为一些记录正在拖尾,有没有办法整理出order_items
彼此下方的格式?
SQL> SELECT order_id, billing_name, items FROM orders;
ORDER_ID BILLING_NAME ITEMS(ORDER_ID, PRODUCT_ID, SELLER_ID, SUB_ORDER_NUMBER, QUANTITY, CONDITION, UNIT_PRICE, COST_CHARGE, TOTAL)
---------- --------------- ---------------------------------------------------------------------------------------------------------------------------------------
1 John Smith ORDER_ITEMS(ORDER_ITEM(1, 1, 1, '3026143053', 1, 'Brand new ', 53.49, 0, 53.49), ORDER_ITEM(1, 2, 2, '3029608429', 1, 'Brand new ', 1.9
2 Sarah Jones ORDER_ITEMS(ORDER_ITEM(2, 3, 3, '3054134547', 2, 'Brand New ', 53.49, 0, 106.98), ORDER_ITEM(2, 4, 4, '3053273551', 1, 'Brand New ', 29
3 Tom Sharpe ORDER_ITEMS(ORDER_ITEM(3, 2, 2, '3073748221', 1, 'Brand New ', 7.97, 2, 9.97), ORDER_ITEM(3, 6, 5, '3146744589', 1, 'Brand New ', 779.9
4 Derek Miller ORDER_ITEMS(ORDER_ITEM(4, 4, 4, '3124685316', 1, 'Brand New ', 299, 0, 299), ORDER_ITEM(4, 5, 5, '3157302741', 1, 'Brand New ', 639.95,
5 Mark Dwight ORDER_ITEMS(ORDER_ITEM(5, 1, 1, '3246315960', 1, 'Brand New ', 53.49, 0, 53.49), ORDER_ITEM(5, 2, 2, '3354174322', 1, 'Brand New ', 1.9
6 Lucy Nolan ORDER_ITEMS(ORDER_ITEM(6, 4, 4, '3821362630', 1, 'Brand New ', 299, 0, 299), ORDER_ITEM(6, 3, 3, '3902471881', 1, 'Brand New ', 53.49,
6 rows selected.
SQL> SPOOL OFF
【问题讨论】:
【参考方案1】:您是否正在寻找这样的结果?
ORDER_ID BILLING_NAME PRODUCT_ID SELLER_ID SUB_ORDER_ QUANTITY CONDITION UNIT_PRICE COST_CHARGE TOTAL
-------- --------------- ---------- --------- ---------- -------- --------- ---------- ----------- --------
1 John Smith 1 1 3026143053 1 Brand new 53.49 0 53.49
2 2 3029608429 1 Brand new 1.90 1 2.90
2 Sarah Jones 3 3 3054134547 2 Brand New 53.49 0 106.98
4 4 3053273551 1 Brand New 29.22 0 29.22
3 Tom Sharpe 2 2 3073748221 1 Brand New 7.97 2 9.97
6 5 3146744589 1 Brand New 779.95 0 779.95
4 Derek Miller 4 4 3124685316 1 Brand New 299.00 0 299.00
5 5 3157302741 1 Brand New 639.95 0 639.95
5 Mark Dwight 1 1 3246315960 1 Brand New 53.49 0 53.49
2 2 3354174322 1 Brand New 1.90 1 1.90
6 Lucy Nolan 4 4 3821362630 1 Brand New 299.00 0 299.00
3 3 3902471881 1 Brand New 53.49 1 54.49
您可以通过结合两件事来做到这一点:扁平化数据的查询(取消嵌套表列 - 每个 order_id
生成多行)和 SQL*Plus 格式化命令 - 在本例中为 break
命令为每个组显示每个(order_id, billing_name)
一次。您可能还需要/想要格式化各个列,例如,1.9 的单价显示为 1.90,但这是一个不相关(而且更容易)的问题;我没有展示如何做到这一点。
所以,这里首先是 SQL*Plus 命令,然后是查询。请注意,嵌套表中的记录具有order_id
属性;那应该是您已经在表中的order_id
,所以我将其从查询(及其输出)中省略了。实际上,不清楚为什么它是记录的一部分,如果“表”嵌套在已经有order_id
的父表中;我会让你对此进行哲学思考。
SQL> break on order_id on billing_name
SQL> select o.order_id, o.billing_name, product_id, seller_id, sub_order_number,
2 quantity, condition, unit_price, cost_charge, total
3 from orders o left outer join lateral (select * from table(o.items))
4 on null is null
5 /
外部(横向)连接对于items
原子地为null
的情况以及items
为空的情况是必要的嵌套表。这两种情况都是可能的;我假设你知道这两者是不一样的。
【讨论】:
谢谢,效果很好,但由于某种原因,它在我不确定的新表中添加了一行。ORDER_ID BILLING_NAME PRODUCT_ID SELLER_ID SUB_ORDER_ QUANTITY CONDITION UNIT_PRICE COST_CHARGE TOTAL ---------- --------------- ---------- ---------- ---------- ---------- ---------- ---------- ----------- ---------- 6 Lucy Nolan 4 4 3821362630 1 Brand New 299 0 299 3 3 3902471881 1 Brand New 53.49 0 53.49
通过设置页面大小找到了解决方案SET PAGESIZE 999
谢谢你的帮助以上是关于SQL Plus 格式化嵌套表列的主要内容,如果未能解决你的问题,请参考以下文章