【问题标题】:Alternate of Union All联合所有的替代
【发布时间】:2022-01-16 03:09:54
【问题描述】:

对于一个特定的要求,我必须准备一个 Oracle SQL,下面是表格及其关系和所需的数据方案:

我可以通过将各个表与 Context 表连接起来,然后使用 Union All 来获取所需的数据,但由于某些限制,我只能在此处使用 where 子句。请建议我是否可以通过 where 子句获得相同的数据。

【问题讨论】:

  • use text, not images/links, for text--including tables & ERDs。转述或引用其他文本。只提供您需要的东西并将其与您的问题联系起来。仅将图像用于无法表达为文本或增强文本的内容。在图像中包含图例/键和说明。当您需要图像时(不在此处),请不要使用透明背景(像这样),因为 SO 用户同时具有白色和黑色背景模式。

标签: sql join union


【解决方案1】:

在没有 UNION 的情况下获得 UNION ALL 的奇特方式

with t1(id,a) as
( 
  SELECT 1,'A' FROM DUAL UNION ALL
  SELECT 2,'B' FROM DUAL UNION ALL
  SELECT 3,'C' FROM DUAL 
),
t2(id,b) as
( 
  SELECT 1,'X' FROM DUAL UNION ALL
  SELECT 2,'Y' FROM DUAL UNION ALL
  SELECT 3,'Z' FROM DUAL 
)
select coalesce(t1.id, t2.id) id, a, b
from t1
full join t2 on 1=2
order by coalesce(t1.id, t2.id), a, b

【讨论】:

    【解决方案2】:

    如果允许系统视图

    select 
      cxt.context_id, cxt.context_name
    , job.Job_cxt_id, job.Job_name
    , loc.loc_cxt_id, loc.geo_id
    from Context_table cxt
    left join ALL_TABLES tbl
      on tbl.table_name in ('JOB_CONTEXT_TABLE', 'LOCATION_CONTEXT_TABLE')
    left join Job_context_table job
      on job.context_id = cxt.context_id
     and tbl.table_name like 'JOB%'
    left join location_context_table loc
      on loc.context_id = cxt.context_id
     and tbl.table_name like 'LOC%'
    order by tbl.table_name
    
    CONTEXT_ID CONTEXT_NAME JOB_CXT_ID JOB_NAME LOC_CXT_ID GEO_ID
    1001 Camp 10001 Admin null null
    1001 Camp null null 100001 12345

    如果没有,那么

    select 
      nvl(cxt1.context_id, cxt2.context_id) as context_id
    , nvl(cxt1.context_name, cxt2.context_name) as context_name
    , job.Job_cxt_id, job.Job_name
    , loc.loc_cxt_id, loc.geo_id
    from Context_table cxt1
    full join Context_table cxt2 on -0!=0
    left join Job_context_table job 
      on job.context_id = cxt1.context_id
    left join location_context_table loc
      on loc.context_id = cxt2.context_id
    order by cxt1.context_id
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-21
      • 1970-01-01
      • 2023-03-21
      • 2011-12-29
      • 1970-01-01
      • 1970-01-01
      • 2019-09-04
      • 2013-09-22
      相关资源
      最近更新 更多