需要你的帮助来解决我得到的错误。我正在使用联合加入两个查询并给我一个错误。以下是查询以及错误消息。
SELECT 'Firewall Rules' as Platform
, 'TestCount' TestCount
, 'TestPassCount' TestPassCount
, percentage as percentage
, firewall_name as Server
from(
SELECT round(avg(replace(PER_OF_VIOLATING_RULES, '%', ''))* 1 , 2)||'%' as percentage
, firewall_name
from table1
group by firewall_name
)
union
select 'Database' as Platform
, count( *) TestCount
, count(case when result_status = 'Not A Finding' then 1 end) TestPassCount
, Round( count(case when result_status = 'Not A Finding' then 1 end) / count(*) * 100 , 2) percentage
, asset as Server
FROM table2
group by asset
ORA-01790: expression must have the same datatype as corresponding expression
01790. 00000 - "expression must have the same datatype as the corresponding expression"
*Cause:
*Action:
Error at Line: 1 Column: 37
有人可以帮忙修改查询吗?
答案 0 :(得分:2)
使用set操作,所有子查询的投影必须具有相同的签名。因此列的数据类型必须匹配。
使用您的顶级子查询,您将返回TestCount
和TestPassCount
的字符串文字,但返回底部子查询的数字。所以你需要改变其中一个预测。您可以使用to_char()
将数字转换为字符串,但最好删除防火墙子查询中的字符串文字:
SELECT 'Firewall Rules' as Platform
, to_number(null) TestCount
, to_number(null) TestPassCount
, percentage as percentage
....
或者你可以使用文字零,这取决于你的需要。
顺便说一下:你可以使用UNION ALL而不是UNION,因为由于platform
字面值,两个子查询的结果集都保证是一个集合。 UNION做了一个确保唯一性的排序,因此对于一个大的查询,UNION ALL更有效。
答案 1 :(得分:0)
'TestCount' TestCount
和TestPassCount' TestPassCount
在第一个查询中是字符串,您在第二个查询中为相应字段提取数值。
您可以typecast
在第二个查询中使用TO_CHAR
功能来解决此问题。