在SQL

时间:2018-04-10 06:39:15

标签: sql oracle pivot

我有下表,需要将行值作为输出。 这是Oracle数据库中视图的一部分。

enter image description here

我需要使用SQL获取输出,如下所示。name,address,region通过引用ID从另一个表中获取。

enter image description here

寻找简单的方法,因为完整查询的列数超过15列,下面也需要添加为列。

感谢。

2 个答案:

答案 0 :(得分:3)

  

“寻找简单的方法,因为完整查询有超过15列”

抱歉,您可以拥有复杂的查询或根本没有查询:)

问题是发布表的结构要求复杂的查询。那是因为它使用了一种所谓的“通用数据模型”,它实际上是一种数据反模型。在不对需求进行建模并将值粉碎到表中所节省的时间是您花费大量时间编写可怕查询以再次获取这些值的时间。

我假设您需要驱逐您引用的另一个表,并且已发布的表包含核心记录的补充属性。

select ano.id
       , ano.name
       , ano.address 
       , ano.region 
       , t1.value as alt_id
       , t2.value as birth_date
       , t3.value as contact_no
from another_table ano
     left outer join ( select id, value 
                       from generic_table
                       where key = 'alt_id' ) t1 
          on ano.id = t1.id
     left outer join ( select id, value 
                       from generic_table
                       where key = 'birth_date' ) t2 
          on ano.id = t2.id
     left outer join ( select id, value 
                       from generic_table
                       where key = 'contact_no' ) t3
          on ano.id = t3.id

请注意需要使用外连接:通用数据模型的一个问题是完整性约束的实施。弱数据类型也可能是一个问题(例如,如果您想将birth_date字符串转换为实际日期)。

答案 1 :(得分:2)

PIVOT概念非常适合这些类型的问题:

SQL> create table person_info(id int, key varchar2(25), value varchar2(25));
SQL> create table person_info2(id int, name varchar2(25), address varchar2(125), region varchar2(25));
SQL> insert into person_info values(4150521,'contact_no',772289317);
SQL> insert into person_info values(4150522,'alt_id','98745612V');
SQL> insert into person_info values(4150522,'birth_date',date '1990-04-21');
SQL> insert into person_info values(4150522,'contact_no',777894561);

SQL> insert into person_info2 values(4150521,'ABC','AAAAAA','ASD');
SQL> insert into person_info2 values(4150522,'XYZ','BBBBB','WER');

SQL> select p1.id, name, address, region, alt_id, birth_date, contact_no  
  from person_info
 pivot
(
 max(value) for key in ('alt_id' as alt_id,'birth_date' as birth_date,'contact_no' as contact_no)
) p1 join person_info2 p2 on (p1.id = p2.id);

ID      NAME    ADDRESS REGION  ALT_ID      BIRTH_DATE  CONTACT_NO
------- ------- ------- ------  ---------   ----------  ----------
4150521 ABC     AAAAAA  ASD     12345678V   21-APR-89   772289317
4150522 XYZ     BBBBB   WER     98745612V   21-APR-90   777894561