Oracle SQL-UNION ALL语句的替代方案

Oracle SQL-UNION ALL语句的替代方案,sql,oracle,oracle11g,oracle10g,Sql,Oracle,Oracle11g,Oracle10g,给定以下使用联合的查询 Select col1,col2,col3,col4,col5,cast(multiset(temp.col1 from table(cast(xslt.children as clob_nt)) temp, col6 from tableA union all Select a,b,c,d,e,cast(multiset(temp.col1 from table(cast(tableB.children as clob_nt)) temp, col7 from tabl

给定以下使用联合的查询

Select col1,col2,col3,col4,col5,cast(multiset(temp.col1 from table(cast(xslt.children as clob_nt)) temp, col6
from tableA
union all
Select a,b,c,d,e,cast(multiset(temp.col1 from table(cast(tableB.children as clob_nt)) temp, col7
from tableB
我希望得到以下输出(即两个表中的行)


还有哪些其他选项允许我在不使用“union”或“union all”的情况下运行查询并获得相同的结果

您实际上可以在Oracle中执行此操作,但编码有点混乱。其思想是对不匹配的字段执行
完全外部联接
,然后使用
coalesce()
将结果合并在一起:

select coalesce(a.col1, b.a) as col1,
       coalesce(a.col2, b.b) as col2,
       coalesce(a.col3, b.c) as col3,
       coalesce(a.col4, b.d) as col4,
       coalesce(a.col5, b.e) as col5,
       coalesce(cast(multiset(temp.col1 from table(cast(xslt.children as clob_nt)),
                cast(multiset(temp.col1 from table(cast(b.children as clob_nt))
               ) as temp,
       coalesce(a.col6, b.col7) as col6
from tableA a full outer join
     tableB b
     on 0 = 1;

但是,我不确定前面的内容是否适用于
temp
列。一个原因是,
cast()
似乎没有完全公式化:

您可以将每个查询的结果存储在(临时)结果表中,然后最终一次获取所有结果

我能想到这样做的唯一原因是将工作分成更小的块,以节省资源(但不确定这会有多大不同),或者分别对不同的查询进行基准测试

下面是这在Oracle中的大致情况。(我更像一个MSSQL人)


您正在选择两个结果列表,并将它们合并为一个列表。这正是联合[一切]的目的所在。那你为什么不想在这里结婚呢?对不起,我想不出什么原因。大概是因为你在上一个问题上看到的行为吧?最好弄清楚这一点;即使你能想出一种方法来避免
联合所有人
,它也会遇到同样的问题。按照Justin的建议制作一个可复制的测试用例可能是你最好的选择。是的,这是因为出于某种原因,union all正在使clob对象无效。我正在尝试为它找到一个快速的临时补丁,同时尝试找出永久解决方案。DBA建议这可能与优化器的配置方式有关,他无法立即查看,因此我正在尝试制定一个临时解决方案。你能给我举一个例子说明你的想法吗意思是。ThanksI对oracle语法的了解可能比您少=),但您的想法是1)创建一个具有所需结果布局的工作表。2) 按顺序运行每个查询,将输出重定向到此工作表3)选择工作表的内容。我将看看是否可以在SqlFiddle中得到类似的结果,并将其编辑到我的答案中……当我执行Union All时,两个表的键列都不可为null,它仍然将视图列报告为null。这使得它不可能引入实体框架。我给了你一次合并的机会,但都是一样的。真希望有一种方法可以指定视图中的一列不可为空,而不管Oracle怎么想。@DavidP。我不知道你的评论和这个答案有什么关系。不过,如果你有问题,请随意提问。我确实发布了一个问题。只是没有答案。
select coalesce(a.col1, b.a) as col1,
       coalesce(a.col2, b.b) as col2,
       coalesce(a.col3, b.c) as col3,
       coalesce(a.col4, b.d) as col4,
       coalesce(a.col5, b.e) as col5,
       coalesce(cast(multiset(temp.col1 from table(cast(xslt.children as clob_nt)),
                cast(multiset(temp.col1 from table(cast(b.children as clob_nt))
               ) as temp,
       coalesce(a.col6, b.col7) as col6
from tableA a full outer join
     tableB b
     on 0 = 1;
CREATE GLOBAL TEMPORARY TABLE MyWorkingTable
   ON COMMIT PRESERVE ROWS 
   AS Select col1,col2,col3,col4,col5,cast(multiset(temp.col1 from table(cast(xslt.children as clob_nt)) temp, col6
      from tableA
     WHERE 1 = 2

INSERT MyWorkingTable (col1,col2,col3,col4,col5, temp, col6)
Select col1,col2,col3,col4,col5,cast(multiset(temp.col1 from table(cast(xslt.children as clob_nt)) temp, col6
      from tableA;


INSERT MyWorkingTable (col1,col2,col3,col4,col5, temp, col6)
Select col1,col2,col3,col4,col5,cast(multiset(temp.col1 from table(cast(xslt.children as clob_nt)) temp, col6
      from tableB;

INSERT MyWorkingTable (col1,col2,col3,col4,col5, temp, col6)
Select col1,col2,col3,col4,col5,cast(multiset(temp.col1 from table(cast(xslt.children as clob_nt)) temp, col6
      from tableC;


-- etc

SELECT * FROM MyWorkingTable;