PL/SQL 开发人员中 Oracle SQL 上的两个表和多个条件之间的完全外部联接不起作用

Full outer join not working between two tables and multiple conditions on Oracle SQL in PL/SQL Developer

我需要有关在 Oracle SQL 下的 PL/SQL Developer 中加入不工作的帮助。我有一个 table VALUES,它有多个列。它的结构是:

CYCLE|PERIOD|FEE|CITY|SERVICE_NAME|CLIENT_TYPE|VALUE

我想做的是在 VALUE 中添加另一列,并将其命名为 PREVIOUS_VALUE。它将包含在 CYCLE、FEE、CITY、SERVICE_NAME 和 CLIENT_TYPE 中具有相同值的行的字段 VALUE,唯一的区别是它属于 PERIOD' = PERIOD - 1。在换句话说,我想在 table.

中的 VALUE 旁边添加前一个时期的值

我的策略如下: 1) 创建一个视图 VV_VIEW,其中包含与 table VALUES 相同的字段,创建如下:

CREATE OR REPLACE VIEW VV_VIEW as SELECT CYCLE, PERIOD,
PREVIOUS_PERIOD(PERIOD) AS PREV_PERIOD, FEE, CITY, SERVICE_NAME, 
CLIENT_TYPE, VALUE FROM VALUES.

2) 对 VV_VIEW 和值进行完全外部连接,从 VV_VIEW 中选择所有列,并添加来自 table 值的列值,条件是 VALUES.PERIOD = VV_VIEW.PREVIOUS_PERIOD 还有 VALUES.CYCLE = VV_VIEW.CYCLE, VALUES.FEE = VV_VIEW.FEE, VALUES.CITY = VV_VIEW.CITY, 等等。 确切的查询如下所示:

CREATE OR REPLACE VIEW FINAL_VIEW AS SELECT VV_VIEW.CYCLE, 
VV_VIEW.PERIOD, VV_VIEW.PREV_PERIOD, VV_VIEW.FEE, VV_VIEW.CITY, 
VV_VIEW.SERVICE_NAME, VV_VIEW.CLIENT_TYPE, VALUES.VALUE AS PREV_VALUE
FROM VV_VIEW FULL OUTER JOIN VALUES 
ON VV_VIEW.PREV_PERIOD = VALUES.PERIOD AND VV_VIEW.FEE = VALUES.FEE AND
VV_VIEW.CITY = VALUES.CITY AND VV_VIEW.SERVICE_NAME = 
VALUES.SERVICE_NAME AND
VV_VIEW.CLIENT_TYPE = VALUES.CLIENT_TYPE;

这样上一时期的 VALUE 将显示在新视图中实际 VALUE 的旁边。

问题是,FULL OUTER JOIN 似乎不起作用。当我使用 RIGHT OUTER JOIN 时,我得到 PREV_VALUE 列中的值,但其他列为 NULL。如果我使用 LEFT OUTER JOIN,我会得到所有列及其各自的值,但 PREV_VALUE 除外,它仍然为 NULL。使用 FULL OUTER JOIN 我得到的结果与使用 LEFT JOIN 的结果相似。

你能告诉我我做错了什么吗?

我想要的,简单来说是这样的:

** TABLE 值 = 原始值 TABLE

CYCLE|PERIOD|FEE|CITY|SERVICE_NAME|CLIENT_TYPE|VALUE

03 |201404|0.5|CTTA|TELEPHONE_SM| PREMIUM   | 3000

03 |201405|0.7|CMFE|TELEPHONE_MM| PREMIUM   | 2000

04 |201312|0.2|CTDA|TELEPHONE_SM| STANDARD  | 500

.....

03 |201403|0.5|CTTA|TELEPHONE_SM| PREMIUM   | 9000

03 |201404|0.7|CMFE|TELEPHONE_MM| PREMIUM   | 8000

.....

03 |201402|0.5|CTTA|TELEPHONE_SM| PREMIUM   | 1000

03 |201403|0.7|CMFE|TELEPHONE_MM| PREMIUM   | 2000

.....

并获得这个新视图:

***FINAL_VIEW

CYCLE|PERIOD|PREV_PERIOD|FEE|CITY|SERVICE_NAME|CLIENT_TYPE|VALUE | PREV_VALUE

03 |201404  | 201403    |0.5|CTTA|TELEPHONE_SM| PREMIUM   | 3000 | 9000

03 |201405  | 201404    |0.7|CMFE|TELEPHONE_MM| PREMIUM   | 2000 | 8000

04 |201312  | 201403    |0.2|CTDA|TELEPHONE_SM| STANDARD  | 500  | ....

.....

03 |201403  | 201402    |0.5|CTTA|TELEPHONE_SM| PREMIUM   | 9000 | 1000

03 |201404  | 201403    |0.7|CMFE|TELEPHONE_MM| PREMIUM   | 8000 | 2000 

.....

03 |201402  | 201401    |0.5|CTTA|TELEPHONE_SM| PREMIUM   | 1000 | .....
..............

我希望你能得到我想做的事情。如果您有其他方法来实现这一点,我真的很想听听。提前致谢。

编辑:修正了查询中的拼写错误。

尝试下面,你应该得到你预期的结果,我使用了“0”(滞后函数中的第三个参数)当以前的值不存在时你可以使用 null 或任何其他值

select 
cycle,
period,
fee,
city,
service_name,
client_type,
value,
lag(period,1,0) over (partition by cycle,fee,city,service_name,client_type order by period) as prev_period,
lag(value,1,0) over (partition by cycle,fee,city,service_name,client_type order by period) as prev_value
from table1
order by cycle,fee,city,service_name,client_type,period;

第二次查询以验证前 3 个值

select 
cycle,
period,
fee,
city,
service_name,
client_type,
value,
row_number() over (partition by cycle,fee,city,service_name,client_type order by period) as rn,
lag(value,1,0) over (partition by cycle,fee,city,service_name,client_type order by period) as prev_value1,
lag(value,2,0) over (partition by cycle,fee,city,service_name,client_type order by period) as prev_value2,
lag(value,3,0) over (partition by cycle,fee,city,service_name,client_type order by period) as prev_value3
from table1
order by cycle,fee,city,service_name,client_type,period;