Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.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_Database_Oracle_Join - Fatal编程技术网

Sql 如何从没有公共值的不同表创建oracle视图

Sql 如何从没有公共值的不同表创建oracle视图,sql,database,oracle,join,Sql,Database,Oracle,Join,我有下列表格 公司 ========================= |COMPANY_ID|COMPANY_NAME| ========================= | C1 | Test1 | | C2 | Test2 | ========================= ========================= |公司ID |公司名称| ========================= |C1 |测试1 | |C

我有下列表格

公司

========================= |COMPANY_ID|COMPANY_NAME| ========================= | C1 | Test1 | | C2 | Test2 | ========================= ========================= |公司ID |公司名称| ========================= |C1 |测试1 | |C2 |测试2| ========================= 部门

======================== |DEPT_ID | DEPT_NAME | ======================== | D1 | Sales | | D2 | HR | ======================== ======================== |部门ID |部门名称| ======================== |D1 |销售| |D2 |小时| ======================== 公司\部门\档案 ==================================================== |PROFILE_ID| DEPT_ID | COMPANY_ID | PROFILE_VALUE| ==================================================== | 1 | D1 | C1 | ACTIVE | | 2 | D2 | C1 | INACTIVE | ==================================================== ======================================== |DEFAULT_ID| DEPT_ID | PROFILE_VALUE| ======================================== | 1 | D1 | ACTIVE | | 2 | D2 | ACTIVE | ======================================== ==================================================== |简介|部门|公司|简介|值| ==================================================== |1 | D1 | C1 |激活| |2 | D2 | C1 |不活动| ====================================================

默认配置文件 ==================================================== |PROFILE_ID| DEPT_ID | COMPANY_ID | PROFILE_VALUE| ==================================================== | 1 | D1 | C1 | ACTIVE | | 2 | D2 | C1 | INACTIVE | ==================================================== ======================================== |DEFAULT_ID| DEPT_ID | PROFILE_VALUE| ======================================== | 1 | D1 | ACTIVE | | 2 | D2 | ACTIVE | ======================================== ======================================== |默认的|部门|档案|值| ======================================== |1 | D1 |激活| |2 | D2 |激活| ========================================

表逻辑是这样的:我们维护一个可用公司和部门的表,这些公司和部门互不依赖。假设COMPANY表中的所有公司都有DEPARTMENT表中的所有部门

公司\部门\配置文件包含与公司相关的部门配置文件信息。此表可能有也可能没有每个公司的数据。在此示例表中,公司\部门\配置文件仅包含公司C1的条目,而不包含公司C2的条目

默认配置文件包含每个部门的默认配置文件值,而不考虑公司。此数据可以由特定公司的公司\部门\配置文件中的值覆盖

现在我需要以以下格式创建一个视图

============================================= |COMPANY_ID|DEPT_ID|PROFILE_ID|PROFILE_VALUE| ============================================= | C1 | D1 | 1 | ACTIVE | | C1 | D2 | 2 | INVACTIVE | | C2 | D1 | 1 | ACTIVE | | C2 | D2 | 2 | ACTIVE | ============================================= ============================================= |公司ID |部门ID |档案ID |档案值| ============================================= |C1 | D1 | 1 |激活| |C1 | D2 | 2 |入侵| |C2 | D1 | 1 |激活| |C2 | D2 | 2 |激活| =============================================
逻辑是我需要为每个公司的每个部门创建一个具有概要文件值的视图。如果公司的“公司”\u“部门”\u配置文件中已经有配置文件值,我们需要从中获取值。但是,如果公司的“公司部门”配置文件中没有任何条目,那么我们需要从“默认部门”配置文件中填充该部门的默认值。

您可以使用交叉联接生成所有公司和部门。然后使用
left join
和一些逻辑输入额外的配置文件信息以选择默认值:

select c.company_id, d.dept_id,
       coalesce(cdp.profile_id, dp.profile_id) as profile_id,
       (case when cdp.profile_id is not null then cdp.profile_value else dp.profile_value end) as profile_value
from company c cross join
     department d left join
     company_department_profile cdp
     on cdp.company_id = c.company_id and cdp.dept_id = cdp.dept_id left join
     default_profile dp
     on d.dept_id = dp.dept_id;

您可以使用
交叉联接
生成所有公司和部门。然后使用
left join
和一些逻辑输入额外的配置文件信息以选择默认值:

select c.company_id, d.dept_id,
       coalesce(cdp.profile_id, dp.profile_id) as profile_id,
       (case when cdp.profile_id is not null then cdp.profile_value else dp.profile_value end) as profile_value
from company c cross join
     department d left join
     company_department_profile cdp
     on cdp.company_id = c.company_id and cdp.dept_id = cdp.dept_id left join
     default_profile dp
     on d.dept_id = dp.dept_id;

这不是你要找的吗

SQL> with
  2    company as
  3      (select 'C1' company_id, 'Test 1' company_name from dual
  4       union all
  5       select 'C2', 'Test 2' from dual),
  6    department as
  7      (select 'D1' dept_id, 'Sales' dept_name from dual
  8       union all
  9       select 'D2', 'HR' from dual),
 10    company_department_profile as
 11      (select 1 profile_id, 'D1' dept_id, 'C1' company_id, 'ACTIVE' profile_value from dual
 12       union all
 13       select 2, 'D2', 'C1', 'INACTIVE' from dual),
 14    default_profile as
 15      (select 1 default_id, 'D1' dept_id, 'ACTIVE' profile_value from dual
 16       union all
 17       select 2, 'D2', 'ACTIVE' from dual)
 18  select
 19    c.company_id,
 20    d.dept_id,
 21    coalesce(cdp.profile_id, dp.default_id) profile_id,
 22    coalesce(cdp.profile_value, dp.profile_value) profile_value
 23  from
 24    company c
 25      cross join
 26    department d
 27      join
 28    default_profile dp
 29      on (dp.dept_id = d.dept_id)
 30      left outer join
 31    company_department_profile cdp
 32      on (cdp.company_id = c.company_id and cdp.dept_id = d.dept_id);

COMPANY_ID DEPT_ID  PROFILE_ID PROFILE_VALUE
---------- -------- ---------- --------------------------------
C1         D1                1 ACTIVE
C1         D2                2 INACTIVE
C2         D2                2 ACTIVE
C2         D1                1 ACTIVE

这不是你要找的吗

SQL> with
  2    company as
  3      (select 'C1' company_id, 'Test 1' company_name from dual
  4       union all
  5       select 'C2', 'Test 2' from dual),
  6    department as
  7      (select 'D1' dept_id, 'Sales' dept_name from dual
  8       union all
  9       select 'D2', 'HR' from dual),
 10    company_department_profile as
 11      (select 1 profile_id, 'D1' dept_id, 'C1' company_id, 'ACTIVE' profile_value from dual
 12       union all
 13       select 2, 'D2', 'C1', 'INACTIVE' from dual),
 14    default_profile as
 15      (select 1 default_id, 'D1' dept_id, 'ACTIVE' profile_value from dual
 16       union all
 17       select 2, 'D2', 'ACTIVE' from dual)
 18  select
 19    c.company_id,
 20    d.dept_id,
 21    coalesce(cdp.profile_id, dp.default_id) profile_id,
 22    coalesce(cdp.profile_value, dp.profile_value) profile_value
 23  from
 24    company c
 25      cross join
 26    department d
 27      join
 28    default_profile dp
 29      on (dp.dept_id = d.dept_id)
 30      left outer join
 31    company_department_profile cdp
 32      on (cdp.company_id = c.company_id and cdp.dept_id = d.dept_id);

COMPANY_ID DEPT_ID  PROFILE_ID PROFILE_VALUE
---------- -------- ---------- --------------------------------
C1         D1                1 ACTIVE
C1         D2                2 INACTIVE
C2         D2                2 ACTIVE
C2         D1                1 ACTIVE

您能告诉我们您尝试过什么select或view语句吗?您能告诉我们您尝试过什么select或view语句吗?我面临的一个问题是,如果在默认配置文件和公司部门配置文件中都有条目,因为我们使用的是左外联接,所以我将获得这两个值。基本上,如果部门信息在公司\部门\个人资料中可用,我应该从那里获取,否则从默认\个人资料表中获取相同的个人资料。我不理解这个问题;我想,联合解决了这样的冲突。你能举个例子吗?我面临的一个问题是,如果在默认配置文件和公司部门配置文件中都有条目,因为我们使用的是左外联接,我将获得这两个值。基本上,如果部门信息在公司\部门\个人资料中可用,我应该从那里获取,否则从默认\个人资料表中获取相同的个人资料。我不理解这个问题;我想,联合解决了这样的冲突。你能举个例子吗?