Sql 创建Oracle视图的反转-已编辑
我有两个表,我需要创建一个视图,该视图显示对象表中每个月未出现在对象值表中的行; 对象: 和对象值:Sql 创建Oracle视图的反转-已编辑,sql,oracle,Sql,Oracle,我有两个表,我需要创建一个视图,该视图显示对象表中每个月未出现在对象值表中的行; 对象: 和对象值: +------+---------+---------+ | ID |OBJECT_ID| MONTH | +------+---------+---------+ | 1 | 1 | 2016-4 | | 2 | 3 | 2016-4 | | 3 | 2 | 2016-5 | | 4 | 3 | 2016-5
+------+---------+---------+
| ID |OBJECT_ID| MONTH |
+------+---------+---------+
| 1 | 1 | 2016-4 |
| 2 | 3 | 2016-4 |
| 3 | 2 | 2016-5 |
| 4 | 3 | 2016-5 |
| 5 | 3 | 2016-6 |
| 6 | 1 | 2016-7 |
+------+---------+---------+
预期结果:
+---------+--------+
|OBJECT_ID| MONTH |
+---------+--------+
| 1 | 2016-4 |
| 3 | 2016-4 |
| 2 | 2016-5 |
| 3 | 2016-5 |
| 3 | 2016-6 |
| 1 | 2016-7 |
+---------+--------+
+---------+--------+
|OBJECT_ID| MONTH |
+---------+--------+
| 2 | 2016-4 |
| 1 | 2016-5 |
| 1 | 2016-6 |
| 2 | 2016-6 |
| 2 | 2016-7 |
| 3 | 2016-7 |
+---------+--------+
我试图实现的是每月未出现在该月值中的所有对象的列表
编辑:
我发布了错误的预期结果,我很抱歉-我试图得到与上述预期结果相反的结果,从而使以下结果成为预期结果:
+---------+--------+
|OBJECT_ID| MONTH |
+---------+--------+
| 1 | 2016-4 |
| 3 | 2016-4 |
| 2 | 2016-5 |
| 3 | 2016-5 |
| 3 | 2016-6 |
| 1 | 2016-7 |
+---------+--------+
+---------+--------+
|OBJECT_ID| MONTH |
+---------+--------+
| 2 | 2016-4 |
| 1 | 2016-5 |
| 1 | 2016-6 |
| 2 | 2016-6 |
| 2 | 2016-7 |
| 3 | 2016-7 |
+---------+--------+
提前谢谢你。你要求的
select OBJECT_ID, MONTH from OBJECT_VALUES;
对象表中每月未显示在对象值表中的行
以下查询将生成:
select object.id as object_id,
months.month
from (select distinct month
from object_values) months
cross join object
left join object_values
on object.id = object_values.object_id
and months.month = object_values.month
where object_values.id is null
order by 2, 1
输出为:
+-----------+--------+
| object_id | month |
+-----------+--------+
| 2 | 2016-4 |
| 1 | 2016-5 |
| 1 | 2016-6 |
| 2 | 2016-6 |
| 2 | 2016-7 |
| 3 | 2016-7 |
+-----------+--------+
请注意,这不是您在问题中给出的输出,但根据您的问题,这应该是输出
12个月的替代方案
上述SQL语句的此变体对嵌套select使用不同的查询,以便准确检索过去12个月的数据:
select object.id as object_id,
months.month
from (select to_char(add_months(trunc(sysdate, 'MONTH'), -level), 'YYYY-fmMM')
as month
from dual
connect by level <= 12) months
cross join object
left join object_values
on object.id = object_values.object_id
and months.month = object_values.month
where object_values.id is null
order by 2, 1;
遗憾的是,您的月份字符串中的月份数只有一位,这意味着它们排序不好。如果您将数据更改为所有月份使用2位数字,则将日期格式中的fmDD替换为DD。您的预期结果似乎是从object_值中选择object_id,month from object_值。我认为您的问题出了问题,因为最后一个表不符合您的要求,即输出记录不应出现在object_值中。您确定提出了正确的问题吗?我猜这是一个简单的选择,你需要从你的提问中选择。我已经编辑了这个问题——我在预期结果上犯了一个错误,但我已经在编辑中更正了它。我正在尝试获得原始预期结果的相反结果。假设您的OBJECT_值在2016-6月份没有任何OBJECT_id的行。然后您是否需要查看结果中的所有对象id?而且,如果列表应该从2016-3年开始,但OBJECT_值中没有这样的月份,该怎么办?您是否获得了感兴趣的月份,或者应该是OBJECT_值中月份列的最小值和最大值之间的月份?感谢您的回答,我在问题中犯了一个错误,但您的回答正是我想要实现的目标。我希望所有没有特定日期的对象都与它们没有出现的日期一起出现。请看我问题的编辑。这就是我的想法。现在,我的输出与您的一致。您是否检查了我发布的SQL?它对你有用吗?是的,我检查了发布的sql,它显示了根本不在值表中的记录,每个月重复这些记录;我只是想让ID显示在它没有出现的月份。我不明白。在我看来,输出表与您在问题末尾发布的完全相同。我的SQL只显示id、月份和对象值中不存在的组合。我们的结果表完全相同。