我有以下2个表:
表:product_hierarchy
SELECT * FROM product_hierarchy;
HEAD: parent_id, child_id
ROW 1: 1000, 1001
ROW 2: 1000, 1002
ROW 3: 1000, 1003
ROW 4: 2000, 2001
ROW 5: 2000, 2002
... etc.
表:attribute_names
SELECT * FROM attribute_names;
HEAD: aname
ROW 1: product_name
ROW 2: price
ROW 3: height
ROW 4: width
ROW 5: length
... etc.
我需要运行一个名为
的函数 FUNCTION get_attribute(id NUMBER(10), attribute_name VARCHAR2(256)) RETURNS VARCHAR2
然后将所有内容组合到表product_hierarchy中。
最终表应如下所示:
表:product_hierarchy
SELECT * FROM table_hierarchy;
HEAD: parent_id, child_id, product_name, price, height, width, length
ROW 1: 1000, 1001, box1, 20, 10, 10, 10
ROW 2: 1000, 1002, box2, 15, 9, 9, 9
ROW 3: 1000, 1003, box3, 30, 15, 15, 15
ROW 4: 2000, 2001, panel1, 5, 10, 10, 2
ROW 5: 2000, 2002, panel2, 10, 20, 20, 3
... etc.
我似乎无法提出适当的SQL查询来完成我需要的工作。任何人都可以胜任这项任务吗?
答案 0 :(得分:0)
要获取长列表中的所有数据是可行的:
SELECT
ph.parent_id,
ph.child_id,
th.aname AS attribute_label,
get_attribute(child_id, th.aname) AS attribute
FROM
product_hierarchy ph
CROSS JOIN table_hierarchy th
将这些属性作为单独的列获取是一项艰巨的任务。即使您使用Oracle的pivot
功能,也无法对变量/未知数量的值执行此操作。您必须指定列中的标签。
所以我希望上面的查询能做到。
如果没有,我认为您必须首先查询table_hierarchy的所有标签,然后,您可以根据找到的标签构建动态SQL语句,并将每个标签转换为一列。然后,您可以从函数返回该数据。这不是一个非常好的解决方案,但我认为如果必须以完全相同的结构返回数据,则别无他法。