Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何删除输出最后一行中的union all_Sql_Oracle - Fatal编程技术网

Sql 如何删除输出最后一行中的union 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

我正在尝试创建一个查询,该查询使用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,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_事件执行即时字符串;我已经看到了这个问题,有时间我会检查一下。干杯