Oracle / SQL-基于参数的动态列

时间:2018-11-01 15:41:46

标签: sql oracle obiee

因此,我正在尝试为人员总数报告构建数据模型,该数据模型使用户可以选择要计算的人员总数(动态列)。我尝试查询下面的脚本(这只是一个示例,真实的脚本有多个计数和百分比),并且系统陷入了循环处理中。我的值列表范围是1-5。 Ive还尝试制作固定值列表,并将对分组列的查询放入值中,这也造成了无休止的处理。有什么想法吗?

(SELECT test1.test1,
    COUNT(DISTINCT id.personid)
    FROM
    table_identifiers id,
    (SELECT DISTINCT
    (CASE WHEN :P_COLUMN = 1 THEN te.ethnicities
    WHEN :P_COLUMN = 2 THEN tc.companyname
    ELSE NULL END) AS test1
    FROM
    table_ethnicities te,
    table_companies tc
    WHERE 1=1

    ) test1
    GROUP BY test1.test1)

1 个答案:

答案 0 :(得分:1)

乍一看,您在最内部 test1查询中有一个笛卡尔联接

FROM
    table_ethnicities te,
    table_companies tc
    WHERE 1=1

这时,您在 table_identifiers test1 查询之间有了第二个Caressian联接。

FROM
    table_identifiers id,(
...
) test1
    GROUP BY test1.test1)

因此,这是此查询的性能低的潜在原因。

要解决test1查询中的问题,我建议使用UNION ALL运算符,例如:

(SELECT test1.test1,
    COUNT(DISTINCT id.personid)
    FROM
    table_identifiers id,
    (SELECT DISTINCT te.ethnicities AS test1
          FROM table_ethnicities te
          WHERE :P_COLUMN = 1
     UNION ALL
     SELECT DISTINCT tc.companyname 
          FROM table_companies tc
          WHERE :P_COLUMN = 2
    ) test1
    GROUP BY test1.test1)

要修复第二个笛卡尔联接,应添加联接条件。