我在三个现有的表上创建了以下查询,它也可以正常工作。
组织表
-------------
id name service
--------------------------------
1 CEO 1, 2, 4
2 ALF 1, 3, 5
3 FRGT
4 OFFICE_IT 1, 2, 7
城市表
-------------
id name
-------------
10 Berlin
20 Paris
30 London
40 Rom
关系表
一个二个一个一个
新视图:
id Organization service City
-----------------------------------------------
1 CEO 1, 2, 4 Berlin
2 ALF 1, 3, 5 Paris
4 OFFICE_IT 1, 7 Rom
但现在我想设计的表在这样一种方式,即价值观 在“服务”列中的字符串的每个字符串都单独写在一行中。
请参见示例:
id Organization service City
-----------------------------------------------
1 CEO 1 Berlin
1 CEO 2 Berlin
1 CEO 4 Berlin
2 ALF 1 Paris
2 ALF 3 Paris
2 ALF 5 Paris
4 OFFICE_IT 1 Rom
4 OFFICE_IT 7 Rom
在此期间,我设法得到了一个相应的查询“组织”表只,没有关系的城市。
SELECT O.ID
, O.name
, trim(COLUMN_VALUE) AS service
FROM Organization o ,
xmltable(('"'
|| REPLACE(o.service, ',', '","')
|| '"'))
然而,我目前缺乏这样的想法 将两个单独的查询压缩到一个SQL查询中。您有解决方案吗?
1条答案
按热度按时间ngynwnxp1#
您可以将逗号连接替换为
CROSS APPLY
(来自Oracle 12):或
CROSS JOIN
(在早期版本中):或者,如果逗号联接在ANSI联接之后,则可以混合使用ANSI联接语法和Oracle的旧版逗号联接语法:
或者,您可以在整个过程中使用传统的逗号连接:
其中,对于示例数据:
所有输出:
| 识别号|姓名|服务|城市|
| - ------|- ------|- ------|- ------|
| 1个|首席执行官|1个|柏林|
| 1个|首席执行官|第二章|柏林|
| 1个|首席执行官|四个|柏林|
| 第二章|ALF|1个|巴黎|
| 第二章|ALF|三个|巴黎|
| 第二章|ALF|五个|巴黎|
| 四个|办公_IT|1个|罗马|
| 四个|办公_IT|第二章|罗马|
| 四个|办公_IT|七|罗马|
fiddle