单个字段的子查询创建多个记录
Subqueries for individual fields create multiple records
我的场景:一个请求可以有多个(最多 3 个)拒绝代码。第一个是主要拒绝代码,次要(第二和第三)拒绝代码是可选的。要确定 rejection_code 排名,有一个名为 rejection_rowId 的字段。如果 rejection_rowId = '1',则为初级拒绝。如果rejection_rowId = '2',则为第二次拒绝。如果是'3',就是第三个。现在,我试图在一条记录中显示属于一个请求的所有 rejection_code 值,而不是为每个 rejection_code 存储 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
子句可以将结果限制为一行。使用聚合函数内的条件,您仅在实际存在拒绝时才在列中显示拒绝,并且您可以将它们拆分为单独的列。
试试这个:
求和:
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 ;
我的场景:一个请求可以有多个(最多 3 个)拒绝代码。第一个是主要拒绝代码,次要(第二和第三)拒绝代码是可选的。要确定 rejection_code 排名,有一个名为 rejection_rowId 的字段。如果 rejection_rowId = '1',则为初级拒绝。如果rejection_rowId = '2',则为第二次拒绝。如果是'3',就是第三个。现在,我试图在一条记录中显示属于一个请求的所有 rejection_code 值,而不是为每个 rejection_code 存储 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
子句可以将结果限制为一行。使用聚合函数内的条件,您仅在实际存在拒绝时才在列中显示拒绝,并且您可以将它们拆分为单独的列。
试试这个:
求和:
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 ;