使用table_2中的每个值作为参数在table_1上运行函数

时间:2014-12-03 12:56:12

标签: sql oracle plsql

我有以下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中的每个child_id上,
  • 使用表attribute_names中的每个属性名称

然后将所有内容组合到表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查询来完成我需要的工作。任何人都可以胜任这项任务吗?

1 个答案:

答案 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语句,并将每个标签转换为一列。然后,您可以从函数返回该数据。这不是一个非常好的解决方案,但我认为如果必须以完全相同的结构返回数据,则别无他法。