我一直在努力加入两种不同的选择。使用UNION给我留下了“太多值”的消息,内部联接完全拒绝运行,因为我没有可连接的实体,我想也许这可能是正确的路径。
我正在尝试创建一个包含三行的小表(“bu”,“bu_plus”,“bu_minus”)和两列(从选择中添加到bu名称中的聚合数字)
这是我现在的选择
SELECT
(SELECT LEVEL, decode(level, 1,'bu_minus', 2,'bu_plus', 3,'bu') AS kombi
FROM dual
WHERE
1 <= (SELECT (SELECT
(
SELECT COUNT(*)
FROM c2
WHERE
--conditions A
) FROM dual
) AS bu_minus FROM dual
AND 2 <= (SELECT (SELECT
(
SELECT COUNT(*)
FROM c2
WHERE
--conditions B
) FROM dual
) AS bu_plus FROM dual
AND 3 <= SELECT ((SELECT
(
SELECT COUNT(*)
FROM c2
WHERE
--conditions A
) FROM dual )+
(SELECT
(
SELECT COUNT(*)
FROM c2
WHERE
--conditions B
) FROM dual)
) AS bu FROM dual) AS uc
) AS TYPE FROM dual CONNECT BY LEVEL <= 3
;
答案 0 :(得分:0)
看起来真的非常复杂(可能不正确;你有太多的选择从双重开始!)做条件计数的方式。
在缺少输入数据和预期输出的情况下,我认为您尝试做的事情可以更容易地写成:
SELECT *
FROM (SELECT COUNT(CASE WHEN <conditions A> THEN 1 END) bu_minus,
COUNT(CASE WHEN <conditions B> THEN 1 END) bu_plus,
COUNT(CASE WHEN <conditions A> THEN 1 END) + COUNT(CASE WHEN <conditions B> THEN 1 END) bu
FROM c2
WHERE <conditions A>
OR <conditions B>)
UNPIVOT (counts FOR bu_type IN (bu_minus, bu_plus, bu));
首先计算单行中的条件计数,然后将它们解开为3行。
它的优点是只从主表中选择一次,并且比原始查询更简单,更易于维护。
然而,这只是一个猜测,如果没有您提供更多信息,那么您是否真的想要这样做是不可能的。