Sql 如何删除输出最后一行中的union all
我正在尝试创建一个查询,该查询使用UNIONALL获取具有相同表名的所有项目/模式。但我得到的是UNION ALL-in-ALL项目/模式的输出。我期待的结果应该是从上一个项目/模式中删除所有的联合 电流输出:Sql 如何删除输出最后一行中的union all,sql,oracle,Sql,Oracle,我正在尝试创建一个查询,该查询使用UNIONALL获取具有相同表名的所有项目/模式。但我得到的是UNION ALL-in-ALL项目/模式的输出。我期待的结果应该是从上一个项目/模式中删除所有的联合 电流输出: select 'ProjectA' AS "PRJ_ID", EVENT, email,modified_by,modified from ProjectA.event UNION ALL select 'ProjectB' AS "PRJ_ID", EVENT, email,modif
select 'ProjectA' AS "PRJ_ID", EVENT, email,modified_by,modified from ProjectA.event UNION ALL
select 'ProjectB' AS "PRJ_ID", EVENT, email,modified_by,modified from ProjectB.event UNION ALL
select 'ProjectC' AS "PRJ_ID", EVENT, email,modified_by,modified from ProjectC.event UNION ALL
select 'ProjectD' AS "PRJ_ID", EVENT, email,modified_by,modified from ProjectD.event UNION ALL
预期产出:
select 'ProjectA' AS "PRJ_ID", EVENT, email,modified_by,modified from ProjectA.event UNION ALL
select 'ProjectB' AS "PRJ_ID", EVENT, email,modified_by,modified from ProjectB.event UNION ALL
select 'ProjectC' AS "PRJ_ID", EVENT, email,modified_by,modified from ProjectC.event UNION ALL
select 'ProjectD' AS "PRJ_ID", EVENT, email,modified_by,modified from ProjectD.event ;
查询:
SET SERVEROUTPUT ON
Declare
v_sql varchar2(500);
v_sql2 varchar2(500);
v_prj_id varchar2(4000):='ProjectA,ProjectB,ProjectC,ProjectD';
BEGIN
Dbms_Output.Put_Line('v_prj_id='||v_prj_id);
--
FOR i IN (SELECT trim(regexp_substr(v_prj_id, '[^,]+', 1, LEVEL)) l
FROM dual
CONNECT BY LEVEL <= regexp_count(v_prj_id, ',') + 1
) LOOP
v_sql := 'select '''|| i.l ||''' AS "PRJ_ID", EVENT, email,modified_by,modified from ' || i.l ||
'.Table UNION ALL';
Dbms_Output.Put_Line (v_sql);
--
END LOOP;
EXECUTE IMMEDIATE v_sql ;
v_sql2 := RTRIM (v_sql, 'UNION ALL');
EXECUTE IMMEDIATE v_sql2 ;
Dbms_Output.Put_Line (v_sql2);
END;
/
您通常使用字符串操作函数,例如
v_sql := substr(v_sql, 1, length(v_sql) - length('UNION ALL'));
您的代码已经在v_sql中修剪字符串了 但如果您希望同时执行所有操作,则必须执行以下操作:
begin
Declare
v_sql varchar2(500);
v_sql2 varchar2(500);
v_prj_id varchar2(4000):='ProjectA,ProjectB,ProjectC,ProjectD';
BEGIN
FOR i IN (SELECT trim(regexp_substr(v_prj_id, '[^,]+', 1, LEVEL)) l
FROM dual
CONNECT BY LEVEL <= regexp_count(v_prj_id, ',') + 1
) LOOP
v_sql := v_sql || 'select '''|| i.l ||''' AS "PRJ_ID", EVENT, email,modified_by,modified from ' || i.l || '.Table UNION ALL ' || chr(10) ;
END LOOP;
v_sql2 := RTRIM(v_sql, 'UNION ALL ' || chr(10) ) || ';';
Dbms_Output.Put_Line (v_sql2);
END;
end;
/
v_sql2现在将拥有所需的全部代码。
以下是RTRIM不是正确的功能。它将删除白名单中右侧的所有字符,因此它将修剪的不仅仅是UNION all
您可以使用SUBSTR和INSTR:
选择str
,RTRIMstr,'UNION ALL'一样糟糕
,SUBSTRstr,1,INSTRstr,'UNION ALL',-1-1一样好
从…起
选择'SELECT*FROM FOO.LLANOINU UNION ALL'作为str FROM dual
x
但你已经有了解决方案?v_sql2:=RTRIM v_sql,'UNION ALL';这将删除它。演示:为什么有几个项目表,看起来都一样?是的,这看起来像一个糟糕的数据模型。您应该修复它,仅使用一个项目表,并使用select*从“ProjectA”、“ProjectB”、“ProjectC”、“ProjectD”中包含项目名称的项目中进行查询。很简单:-嗨@GanesanVC,还有一件事要提醒你:当你有一个解决问题的答案时,你就把这个答案标记为正确的,那就是你接受它。如果有帮助的话,你也可以投票支持这个答案。请检查如何操作:RTRIM删除集合中的所有字符是正确的,但在这种情况下没有问题,因为字符串以“event UNION all”结尾,所以包括前导空格的“UNION all”将被删除。不过这很好,你指出了这一点,因为OP可能不知道他们实际上在做什么。@ThorstenKettner看一看我编的例子。在这段时间结束之前,一切都会好起来。t不包含unioal中的任何字符,因此OP很幸运。感谢您的查询。我还需要将where条件解析为该查询中的绑定变量。但我得到的错误通常是PL/SQL编译错误。v_sql:=v_sql | | |'选择'| | i.l | | |'作为PRJ|u ID、事件、电子邮件、修改人、修改自'| | i.l | |';使用v_事件执行即时字符串;我已经看到了这个问题,有时间我会检查一下。干杯