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_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)
要修复第二个笛卡尔连接,您应该添加连接条件。
所以我正在尝试为人数报告构建一个数据模型,允许用户 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_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)
要修复第二个笛卡尔连接,您应该添加连接条件。