【问题标题】:Subqueries for individual fields create multiple records单个字段的子查询创建多个记录
【发布时间】:2023-03-21 01:32:01
【问题描述】:

我的场景:一个请求可以有多个(最多 3 个)拒绝代码。第一个是主要拒绝代码,次要(第二和第三)拒绝代码是可选的。要确定rejection_code 排名,有一个名为rejection_rowId 的字段。如果rejection_rowId = '1',那么它是主要拒绝。如果rejection_rowId = '2',则为第二次拒绝。如果是“3”,则为第三个。现在,我试图在一条记录中显示属于一个请求的所有拒绝代码值,而不是为每个拒绝代码存储 1 条记录。我遇到了麻烦,想知道是否有人可以解释为什么我的 SQL 不能正常工作。

我的SQL基本上是这样的;

SELECT DISTINCT rea.id
    ,(SELECT rejection_code 
      FROM rejection t1
      INNER JOIN reason t2 ON t1.rowId = t2.rowId
      WHERE t1.rejection_rowId = '1'
        AND t1.rowId = REA.rowId) AS rejection1

    ,(SELECT rejection_code 
      FROM rejection t1
      INNER JOIN reason t2 ON t1.rowId = t2.rowId
      WHERE t1.rejection_rowId = '2'
        AND t1.rowId = REA.rowId) AS rejection2

    ,(SELECT rejection_code 
      FROM rejection t1
      INNER JOIN reason t2 ON t1.rowId = t2.rowId
      WHERE t1.rejection_rowId = '3'
        AND t1.rowId = REA.rowId) AS rejection3

FROM reason rea
INNER JOIN rejection rej ON rea.rowId = rej.rowId
WHERE rea.id = '12345';

上述SQL生成的输出是……

id    | rejection1 | rejection2 | rejection3
12345 | 26         | NULL       | NULL
12345 | NULL       | 51         | NULL
12345 | NULL       | NULL       | 3

我正在尝试(但失败)生成的输出是...

id    | rejection1 | rejection2 | rejection3
12345 | 26         | 51         | 3

如果有人可以帮助我识别并解决问题,我将不胜感激。谢谢!

【问题讨论】:

    标签: sql subquery teradata


    【解决方案1】:

    我认为你正在尝试做这样的事情:

    SELECT
      rea.id,
      MAX(CASE WHEN rej.rejection_rowId = '1' THEN rej.rejection_code END) AS rejection1,
      MAX(CASE WHEN rej.rejection_rowId = '2' THEN rej.rejection_code END) AS rejection2,
      MAX(CASE WHEN rej.rejection_rowId = '3' THEN rej.rejection_code END) AS rejection3,
    FROM
      reason rea
      INNER JOIN rejection rej ON rea.rowId = rej.rowId
    WHERE
      rea.id = '12345'
    GROUP BY rea.id
    

    没有必要一次又一次地在同一个表之间连接,使用子查询来实现你所需要的根本没有必要,而且成本很高

    使用GROUP BY 子句可以将结果限制为一行。使用聚合函数中的条件,您仅在实际存在拒绝时才在列中显示拒绝,并且您可以将它们拆分为单独的列。

    【讨论】:

    • 太棒了,谢谢!这成功了。我之前尝试过使用case语句,但我没有想到使用聚合函数和group by语句。
    【解决方案2】:

    试试这个:

    求和:

    SELECT DISTINCT rea.id
        ,SUM(SELECT rejection_code 
          FROM rejection t1
          INNER JOIN reason t2 ON t1.rowId = t2.rowId
          WHERE t1.rejection_rowId = '1'
            AND t1.rowId = REA.rowId) AS rejection1
    
        ,SUM(SELECT rejection_code 
          FROM rejection t1
          INNER JOIN reason t2 ON t1.rowId = t2.rowId
          WHERE t1.rejection_rowId = '2'
            AND t1.rowId = REA.rowId) AS rejection2
    
        ,SUM(SELECT rejection_code 
          FROM rejection t1
          INNER JOIN reason t2 ON t1.rowId = t2.rowId
          WHERE t1.rejection_rowId = '3'
            AND t1.rowId = REA.rowId) AS rejection3
    
    FROM reason rea
    INNER JOIN rejection rej ON rea.rowId = rej.rowId
    WHERE rea.id = '12345'
    GROUP BY rea.id ;
    

    最大:

    SELECT DISTINCT rea.id
        ,MAX(SELECT rejection_code 
          FROM rejection t1
          INNER JOIN reason t2 ON t1.rowId = t2.rowId
          WHERE t1.rejection_rowId = '1'
            AND t1.rowId = REA.rowId) AS rejection1
    
        ,MAX(SELECT rejection_code 
          FROM rejection t1
          INNER JOIN reason t2 ON t1.rowId = t2.rowId
          WHERE t1.rejection_rowId = '2'
            AND t1.rowId = REA.rowId) AS rejection2
    
        ,MAX(SELECT rejection_code 
          FROM rejection t1
          INNER JOIN reason t2 ON t1.rowId = t2.rowId
          WHERE t1.rejection_rowId = '3'
            AND t1.rowId = REA.rowId) AS rejection3
    
    FROM reason rea
    INNER JOIN rejection rej ON rea.rowId = rej.rowId
    WHERE rea.id = '12345'
    GROUP BY rea.id ;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-06
      • 1970-01-01
      • 1970-01-01
      • 2013-12-09
      • 1970-01-01
      • 2016-01-19
      • 1970-01-01
      相关资源
      最近更新 更多