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 以便:
- 您必须 return 第 1 页上的所有字段。
- 不应 return 编辑第 2 页上的任何字段。
- 您必须 return 第 3 页上的所有字段。
而且这必须用 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)
上的索引。
我想知道如何解决以下问题:
我有以下 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 以便:
- 您必须 return 第 1 页上的所有字段。
- 不应 return 编辑第 2 页上的任何字段。
- 您必须 return 第 3 页上的所有字段。
而且这必须用 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)
上的索引。