Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.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向下选择查询结果_Sql_Oracle_Join_Union - Fatal编程技术网

基于字段复制的SQL向下选择查询结果

基于字段复制的SQL向下选择查询结果,sql,oracle,join,union,Sql,Oracle,Join,Union,我正在寻找有关SQL查询的一些帮助。我正在使用Oracle 我有一个查询,它是两个不同的select语句的并集。结果数据如下所示: Col1 Col2 Col3 XXX ValA Val1 XXX ValB Val2 YYY ValA Val1 YYY ValA Val2 Col1 Col2 Col3 XXX ValB Val2 YYY ValA Val1

我正在寻找有关SQL查询的一些帮助。我正在使用Oracle

我有一个查询,它是两个不同的select语句的并集。结果数据如下所示:

Col1     Col2     Col3
XXX      ValA     Val1
XXX      ValB     Val2
YYY      ValA     Val1
YYY      ValA     Val2
Col1     Col2     Col3
XXX      ValB     Val2
YYY      ValA     Val1
YYY      ValA     Val2
在此设置中,Col1=XXX为默认值,Col1=YYY为实际值。实际值YYY应比默认值更精确。实际值通过第2列和第3列定义

我希望将这些结果归纳为以下几个方面:

Col1     Col2     Col3
XXX      ValA     Val1
XXX      ValB     Val2
YYY      ValA     Val1
YYY      ValA     Val2
Col1     Col2     Col3
XXX      ValB     Val2
YYY      ValA     Val1
YYY      ValA     Val2
请注意,第一行已被删除。。。这是因为第3行中有一个实际值YYY大于默认值XXX


你有什么想法吗?

我想你可以使用这样的技巧:

select
  case when
  max(case when col1<>'XXX' then col1 end) is null then 'XXX' else
  max(case when col1<>'XXX' then col1 end) end as col1, 
  col2,
  col3
from
  your_table
group by col2, col3

我将默认值转换为null,然后按col3分组。null和值之间的最大值是您要查找的值。这适用于您的示例数据,但它可能并不完全是您想要的,它取决于您的真实数据。

我认为您可以使用以下技巧:

select
  case when
  max(case when col1<>'XXX' then col1 end) is null then 'XXX' else
  max(case when col1<>'XXX' then col1 end) end as col1, 
  col2,
  col3
from
  your_table
group by col2, col3

我将默认值转换为null,然后按col3分组。null和值之间的最大值是您要查找的值。这适用于您的示例数据,但它可能并不完全是您要查找的数据,这取决于实际数据的方式。

您希望过滤掉col2和col3显示为XXX和其他值的所有行

您可以通过使用分析函数在子查询中进行适当的计数来实现此筛选器:

select col1, col2, col3
from (select t.*,
             count(*) over (partition by col2, col3) as numcombos,
             sum(case when col1 = 'XXX' then 1 else 0 end) over (partition by col2, col3) as numxs
      from t
     ) t
where numcombos = numxs or (col1 <> 'xxx')

您希望过滤掉col2和col3显示为XXX和其他值的所有行

您可以通过使用分析函数在子查询中进行适当的计数来实现此筛选器:

select col1, col2, col3
from (select t.*,
             count(*) over (partition by col2, col3) as numcombos,
             sum(case when col1 = 'XXX' then 1 else 0 end) over (partition by col2, col3) as numxs
      from t
     ) t
where numcombos = numxs or (col1 <> 'xxx')

我的直觉是使用分析函数:

select distinct 
       first_value(col1) 
          over (partition by col2, col3 
                order by case col1 
                when 'XXX' then 1 
                else 0 end asc) as col1,
       col2, 
       col3 
from table1
但是,如果表较大且已编制索引,则最好使用完整的外部联接来解决此问题,因为只有两个可能的值:

select coalesce(rl.col1, dflt.col1) as col1, 
       coalesce(rl.col2, dflt.col2) as col2,
       coalesce(rl.col3, dflt.col3) as col3
from (select * from table1 where col1 = 'XXX') dflt
full outer join (select * from table1 where col1 <> 'XXX') rl
on dflt.col2 = rl.col2 and dflt.col3 = rl.col3;

我的直觉是使用分析函数:

select distinct 
       first_value(col1) 
          over (partition by col2, col3 
                order by case col1 
                when 'XXX' then 1 
                else 0 end asc) as col1,
       col2, 
       col3 
from table1
但是,如果表较大且已编制索引,则最好使用完整的外部联接来解决此问题,因为只有两个可能的值:

select coalesce(rl.col1, dflt.col1) as col1, 
       coalesce(rl.col2, dflt.col2) as col2,
       coalesce(rl.col3, dflt.col3) as col3
from (select * from table1 where col1 = 'XXX') dflt
full outer join (select * from table1 where col1 <> 'XXX') rl
on dflt.col2 = rl.col2 and dflt.col3 = rl.col3;

究竟是什么使YYY成为实际值,而XXX成为默认值,现在还不清楚。如果没有办法区分哪个是首选,您将很难做到这一点。YYY只是我通过另一个查询知道的真实姓名的一个占位符。XXX是默认值的设置字符串值。我已经解决了那个问题。谢谢。每个Col2、Col3对是否只有一个YYY值,或者可能有多个?只有一个YYY值可能没有,在这种情况下,XXX值是used@typhoid当前位置你没有抓住我评论的重点。如果我们不知道XXX是一个常数,这个问题就无法解决,这在您的场景中没有说明。知道它是一个常数,我们就可以直接测试它,你会注意到所有答案都是这样的。现在还不清楚是什么让YYY成为一个实际值,而XXX成为一个默认值。如果没有办法区分哪个是首选,您将很难做到这一点。YYY只是我通过另一个查询知道的真实姓名的一个占位符。XXX是默认值的设置字符串值。我已经解决了那个问题。谢谢。每个Col2、Col3对是否只有一个YYY值,或者可能有多个?只有一个YYY值可能没有,在这种情况下,XXX值是used@typhoid当前位置你没有抓住我评论的重点。如果我们不知道XXX是一个常数,这个问题就无法解决,这在您的场景中没有说明。知道它是一个常数,让我们直接测试它,你会注意到所有答案都是这样。