加入选择

时间:2017-12-01 09:51:43

标签: sql oracle11g

我一直在努力加入两种不同的选择。使用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
;

1 个答案:

答案 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行。

它的优点是只从主表中选择一次,并且比原始查询更简单,更易于维护。

然而,这只是一个猜测,如果没有您提供更多信息,那么您是否真的想要这样做是不可能的。

相关问题