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;
我需要有关在 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;