sql - 各个字段的子查询创建多条记录

标签 sql subquery teradata

我的场景:一个请求可以有多个(最多 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

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

最佳答案

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

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

关于sql - 各个字段的子查询创建多条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35184331/

相关文章:

sql - 基于key的随机SELECT查询

mysql - 如何使用子查询、WHERE IN 和 varchar 比较字段优化查询?

mysql - 如何删除基于组合两列的条目

java - 如何从数据库[Cursor Adapter]获取值并将其存储到java中的数组中?

mysql - SQL按日期分组问题

php - 在 PHPMyadmin 中的多列上添加 FK 约束

sql-server - "Sub SELECT before INNER JOIN"还是 "WHERE after INNER JOIN"?

sql - 从一组列值中识别有效的 IP

mysql - 如何在 Teradata Viewpoint 中查找外键

sql - 拆分字符串 Teradata SQL