Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 创建Oracle视图的反转-已编辑_Sql_Oracle - Fatal编程技术网

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、月份和对象值中不存在的组合。我们的结果表完全相同。