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

Oracle/SQL - Dynamic columns based on parameter

所以我正在尝试为人数报告构建一个数据模型,允许用户 select 他希望通过(动态列)计算的人数。我试着查询下面的脚本(这只是一个例子,真实的脚本有几个计数和百分比)并且系统像循环一样卡在处理中。我的值列表范围为 1-5。我还尝试制作一个固定的值列表,并将对分组列的查询放在值中,这也造成了无休止的处理。有什么想法吗?

(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)

好吧,乍一看你有一个笛卡尔连接在你最inner test1 query

FROM
    table_ethnicities te,
    table_companies tc
    WHERE 1=1

然后您在 table_identifierstest1 查询之间有第二个 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)

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