PLSQL Oracle - 帮助构建 select

PLSQL Oracle - Help to build a select

我想知道如何解决以下问题:

我有以下 tables:

Tables

| data_id      | field_id    | fieldValue |  
| ------------ | ----------- | ---------- |
| 1            | 1           | Pedro      |
| 2            | 2           | Angel|
| 3            | 3           | Carlos|
| 4            | 4           | null|
| 5            | 5           | null|
| 6            | 6           | null|
| 7            | 7           | null|
| 8            | 8           | Math|

字段

| field_id | field_description | page |
|---- |------| -----|
| 1  | abc1    | 1 |
| 2  | abc2    | 1 |
| 3  | abc3    | 1 |
| 4  | abc4    | 2 |
| 5  | abc5   | 2 |
| 6  | abc6    | 2 |
| 7  | abc7    | 3 |
| 8  | abc8    | 3 |

我有以下情况:我只有 table 个字段 (Table: 字段) 和另一个数据 table (Table: 数据).

在数据table中我有以下结构:

您的 ID、字段 ID(字段的 FK table)以及该字段的值。

它们代表我的数据中读取和填充的表单字段 table。又比如,有些字段是表单第一页、第二页或第三页的字段。

我必须构建一个满足以下要求的 select:

-如果这个页面上的所有值都是null,我应该不会return这个页面上的任何值。

-如果只有一个字段填写了值,我必须return该页面上的所有值,甚至是空值。

在 table 上面的示例中,我必须在数据 table 中创建一个 selection 以便:

而且这必须用 PLSQL 语言完成,我想了解如何配置这个 selection。我尝试了几种方法,但都失败了。

这些值组成了tables,我作为测试添加的,实际我会有几千个结果。

简而言之,您只需要一个接受页码并在任何字段不为空时提供数据的查询。

您可以使用分析函数count来计算非空值,如下所示:

Select * from
(Select d.*, f.*, count(fieldvalue) over () as cnt
  From fields f join data d on d.field_id = f.field_id
 Where f.page = <input_page_number_here>)
Where cnt> 0
  

如果您希望所有页面数据都符合您的逻辑而不传递输入页码,请使用以下查询:

Select * from
(Select d.*, f.*, count(fieldvalue) over (partition by f.page) as cnt
  From fields f join data d on d.field_id = f.field_id)
Where cnt> 0

你可以用 exists:

select f.*
from fields f
where page = ? and exists (
    select 1 from fields f1 where f1.page = f.page and f.value is not null
)

此查询应利用 (page, value) 上的索引。