Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.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
Oracle SQL视图:借助外键将多行转换为一行_Sql_Oracle_Oracle11g - Fatal编程技术网

Oracle SQL视图:借助外键将多行转换为一行

Oracle SQL视图:借助外键将多行转换为一行,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,我有两张桌子: 表A: pk_id, value pk_id, key, value, fk_id 1, value 1, key1, value1, 1 2, key2, value2, 1 3, key3, value3, 1 表B: pk_id, value pk_id, key, value, fk_id 1, value 1, key1, value1, 1 2, key2, value2, 1 3, key3, value3, 1 e、 g。 表a: pk_id, v

我有两张桌子:

表A:

pk_id,
value
pk_id,
key,
value,
fk_id
1, value
1, key1, value1, 1
2, key2, value2, 1
3, key3, value3, 1
表B:

pk_id,
value
pk_id,
key,
value,
fk_id
1, value
1, key1, value1, 1
2, key2, value2, 1
3, key3, value3, 1
e、 g。 表a:

pk_id,
value
pk_id,
key,
value,
fk_id
1, value
1, key1, value1, 1
2, key2, value2, 1
3, key3, value3, 1
e、 g.表b:

pk_id,
value
pk_id,
key,
value,
fk_id
1, value
1, key1, value1, 1
2, key2, value2, 1
3, key3, value3, 1
因此,不可能定义一个包含所有键的表,因为我们从另一个应用程序获取数据,但数据并不总是相同的,并且必然会发生变化

我需要的是一个视图(或者如果可以通过其他方式,我也不介意),它显示如下数据:

id, value, key1, key2, key3
1, value, value1, value2, value3
因此,表A中与一行相连的所有内容都显示在一行中。可以从表B中定义应在视图中显示的键


提前感谢。

这不能使用视图来完成,因为视图有预先确定的列数。您必须按照以下方式构造SQL,并使用SYS\u REFCURSOR进行查询:

select a.pk_id,
       a.value,
       max(decode(b.key, 'key1', b.value)) key1,
       max(decode(b.key, 'key2', b.value)) key2,
       max(decode(b.key, 'key3', b.value)) key3
from   a
left join b on a.pk_id = b.fk_id
group by a.pk_id, a.value
;

尝试此查询。这对你有帮助

SELECT a.pk_id,a.value,
MAX(CASE WHEN b.key='key1' THEN b.value ELSE '0' END) AS key1,
MAX(CASE WHEN b.key='key2' THEN b.value ELSE '0' END) AS key2,
MAX(CASE WHEN b.key='key3' THEN b.value ELSE '0' END) AS key3
FROM table_b b 
LEFT OUTER JOIN table_a a on a.pk_id = b.fk_id
GROUP BY b.fk_id,a.pk_id,a.value
ORDER BY b.fk_id ASC

你所要做的是一件好事。你能告诉我们到目前为止你都尝试了什么吗?我确实尝试了pivot功能,但是没有聚合功能,我想不出如何使用它。根据下面的答案,我可以写下我需要的查询,谢谢!