我有下表,需要将行值作为输出。 这是Oracle数据库中视图的一部分。
我需要使用SQL获取输出,如下所示。name,address,region
通过引用ID
从另一个表中获取。
寻找简单的方法,因为完整查询的列数超过15列,下面也需要添加为列。
感谢。
答案 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