我正在创建一个WITH ROWID、On-Commit快速刷新实例化视图,据我所知,Oracle要求定义mview的查询使用非ANSI(旧Oracle)风格的联接.我有一个联接,我不知道如何转换为旧的Oracle联接,而且内置的Oracle转换工具不能正确处理.

将EMP视为

EmpID Department
1 Retail
2 Retail
3 Corporate
4 Corporate
5 Corporate

和开销为

EmpID Overhead
1 $10
2 $20
3 $100
4 $120
5 $220

我正在try 为olapgo 规范化,所以我想做这样的事情.

EmpID Department CorpOverhead
1 Retail null
2 Retail null
3 Corporate $100
4 Corporate $120
5 Corporate $220

在ANSI中,我知道如何做到这一点,并获得我想要的结果:

select 
   EMP.EmpID, 
   EMP.Department, 
   OVERHEAD.Overhead as CorpOverhead
from EMP
left join OVERHEAD on 
   OVERHEAD.EmpID = EMP.EmpID 
   and EMP.Department = 'Corporate'

在古老的先知中,我被难住了.用于在连接方法之间切换的SQLDeveloper工具为我提供了以下内容

select 
   EMP.EmpID, 
   EMP.Department, 
   OVERHEAD.Overhead as CorpOverhead
from EMP,
   OVERHEAD 
where 
   OVERHEAD.EmpID(+) = EMP.EmpID 
   and EMP.Department = 'Corporate'

这导致了

EmpID Department CorpOverhead
3 Corporate $100
4 Corporate $120
5 Corporate $220

这不是我想要的.

我如何编写一个旧的Oracle连接来实现与ANSI连接相同的功能?

推荐答案

您可以在JOIN中使用CASE表达式:

select e.EmpID, 
       e.Department, 
       o.Overhead as CorpOverhead
from   EMP e,
       OVERHEAD o
where  CASE e.department WHEN 'Corporate' THEN e.EmpID END = o.EmpID (+)

对于您的样本数据,它输出:

EMPID DEPARTMENT CORPOVERHEAD
3 Corporate 100
4 Corporate 120
5 Corporate 220
1 Retail null
2 Retail null

fiddle

Sql相关问答推荐

SQL查询以创建手头的流动余额?

在Golang中管理数据库事务的简洁方法

防止ActiveRecord迁移在db/structure.sql中进行巨大更改

PostgreSQL:使用JSONB中的字段使用jsonb_to_Records()填充记录

在SQL查询中使用COALESS

用户购买平台及金额统计

从数据库中查找总和大于或等于查询中的数字的数字

Select 列组(按同一表格中的另一列分组)Laravel 10

将一个数组反嵌套到另外两个数组SQL中(Athena/presto)

我如何才能在付款人单列中拉出只有9个付款人单的人?

比较SQL中以逗号分隔的字符串

如何使用聚合连接两个表

更改重复值的情况

删除行而不使数据库超载

通过ID和数据找到每个不同的值

如何使用最后一个非 NULL 值在 PostgreSQL 列中填充 NULL 值

PostgreSQL 中将数据从 JSONB 类型转换为 Array 类型

PostgreSQL-用第一个非空填充以前的值

根据行号将列转置为没有任何id或键列的行

如何从 2 个 SQLite 表构建嵌套对象?