根据行间条件查看人口

时间:2017-07-28 10:47:10

标签: sql oracle view restriction

我正在尝试创建并填充视图,但是有一些棘手的标准让我的速度变慢了。 流入的所有数据都来自数据库中的其他表。

我只需要在另一行(同一个表)符合给定约束时选择一行:例如,给定一条记录,我会在以下情况下接受:

  • 它与同一表中的另一条记录共享CODE;
  • 它有一定的TYPE;
  • 它的DATE与另一个TYPE匹配但是相同的CODE;
  • 它的值比匹配记录大;

的示例:

1. CODE1 - TYPE.A - 01/12 - 200
2. CODE1 - TYPE.B - 01/12 - 300
3. CODE1 - TYPE.B - 01/09 - 300
4. CODE1 - TYPE.B - 01/12 - 100
5. CODE2 - TYPE.B - 01/12 - 200
6. CODE1 - TYPE.A - 01/12 - 300

在上面的记录中,我只会排第2行,因为它与一行TYPE“A”(约束1)共享CODE,它有一个TYPE“B”(R2),它与之匹配所述记录(R3),其VALUE大于匹配记录(300> 200)。

  • 第3行不行,因为它的日期错误;
  • 第4行不行,因为它的值较低;
  • 第5行包含错误的CODE;
  • 第6行有错误的TYPE;

这只是为了给你一张整个场景的照片。 我无法理解的是如何在同一个表格中进行这种行间检查。

我希望我解释自己,为了解决这个问题,我们应该为你做好准备!

1 个答案:

答案 0 :(得分:1)

如果我理解正确,您可以使用join

执行此操作
select t.*
from t join
     t tt
     on t.code = tt.code and
        t.date = tt.date
        t.type = 'Type.B' and
        tt.type = 'Type.A' and
        t.value > tt.value;

或等效地,exists

select t.*
from t
where exists (select 1
              from tt
              where t.code = tt.code and
                    t.date = tt.date
                    t.type = 'Type.B' and
                    tt.type = 'Type.A' and
                    t.value > tt.value
             );