还是不行,不使用union all 我之前提供的sql可以正常查询,加上union all就不行了
时间: 2023-07-18 13:47:51 浏览: 48
看到你的问题了,你的 SQL 语句中使用了带有参数的函数 zhFUNc_GETNEWIDFORCIR(id),这种情况下,需要使用子查询来避免在 UNION ALL 语句中使用带参数的函数。
可以把 zhFUNc_GETNEWIDFORCIR(id) 函数的调用放到 SELECT 语句的子查询中,然后将结果作为一个列返回。例如:
```
SELECT '155427848241370' || SEQ_KD_INDEX.nextval || 'GJ', a.PROBABLECAUSE,
(SELECT zhFUNc_GETNEWIDFORCIR(id) FROM (SELECT id FROM gistar.tdn_switch ch WHERE ch.ipaddress = a.IP AND ROWNUM = 1)),
'1028200001',
(SELECT name FROM gistar.tdn_switch ch WHERE ch.ipaddress = a.IP AND ROWNUM = 1),
(SELECT code FROM gistar.tdn_switch ch WHERE ch.ipaddress = a.IP AND ROWNUM = 1),
a.IP,
a.ALARMTIME,
a.alarmtext,
SYSDATE,
NULL,
a.alarmid,
a.createtime,
a.perceivedseverity,
a.moname
FROM
(SELECT x.*,
(SELECT COUNT(DISTINCT re.coveraddressid)
FROM gistar.jr_customer_record@yjyx_zy re
WHERE re.project_type IN ('FTTH宽带')
AND re.oltip = x.IP) AS oltcount
FROM gistar.t_trouble_alarminfo x) a
WHERE
a.specialty = 'PON'
AND a.motype = 'OLT'
AND IP IS NOT NULL
AND a.PROBABLECAUSE = 'OLT网管脱网'
AND (SELECT substr(b.tt_number, 0, 2)
FROM fwbz.t_trouble_ticket_new@GDOSSDB_SGDD b
WHERE a.tt_id = b.tt_id) = 'NM'
AND (SELECT title
FROM fwbz.t_trouble_ticket_new@GDOSSDB_SGDD b
WHERE a.tt_id = b.tt_id) = 'OLT网管脱网'
AND ((SYSDATE < '2021-05-01' AND a.oltcount >= 600) OR a.oltcount >= 400)
UNION ALL
SELECT '155427848241370' || SEQ_KD_INDEX.nextval || 'GJ',
a.PROBABLECAUSE,
(SELECT zhFUNc_GETNEWIDFORCIR(id) FROM (SELECT id FROM gistar.tdn_switch ch WHERE ch.ipaddress = a.IP AND ROWNUM = 1)),
'1028200001',
(SELECT name FROM gistar.tdn_switch ch WHERE ch.ipaddress = a.IP AND ROWNUM = 1),
(SELECT code FROM gistar.tdn_switch ch WHERE ch.ipaddress = a.IP AND ROWNUM = 1),
a.IP,
a.ALARMTIME,
a.alarmtext,
SYSDATE,
a.cleartime,
a.alarmid,
a.createtime,
a.perceivedseverity,
a.moname
FROM
(SELECT x.*,
(SELECT COUNT(DISTINCT re.coveraddressid)
FROM gistar.jr_customer_record@yjyx_zy re
WHERE re.project_type IN ('FTTH宽带')
AND re.oltip = x.IP) AS oltcount
FROM gistar.t_trouble_alarminfo x) a
WHERE
a.specialty = 'PON'
AND a.motype = 'OLT'
AND IP IS NOT NULL
AND a.PROBABLECAUSE = 'OLT网管脱网'
AND (SELECT substr(b.tt_number, 0, 2)
FROM fwbz.t_trouble_ticket_new@GDOSSDB_SGDD b
WHERE a.tt_id = b.tt_id) = 'NM'
AND (SELECT title
FROM fwbz.t_trouble_ticket_new@GDOSSDB_SGDD b
WHERE a.tt_id = b.tt_id) = 'OLT网管脱网'
AND ((SYSDATE < '2021-05-01' AND a.oltcount >= 600) OR a.oltcount >= 400)
AND a.cleartime IS NOT NULL
AND a.alarmid IN (SELECT alarm_id
FROM olt_ALARM_BILL
GROUP BY alarm_id, device_ip, alarm_time, create_time
HAVING count(*) = 1);
```
这种情况下,zhFUNc_GETNEWIDFORCIR(id) 函数的调用就变成了:
```
(SELECT zhFUNc_GETNEWIDFORCIR(id) FROM (SELECT id FROM gistar.tdn_switch ch WHERE ch.ipaddress = a.IP AND ROWNUM = 1))
```
这样就可以避免在 UNION ALL 语句中使用带参数的函数了。