Oracle SQL:使用逻辑显示单个 table 的多行中的单列

Oracle SQL: Display single columns from multiple rows of a single table with Logic

甲骨文SQL

我想在具有多个连接的现有长查询中同时查找来自同一 table 的同一列的 2 行数据。

当前 table 设置(单个 table):

Table: ACCOUNT_DETAILS
| TRX_ID | TYPE | FAC_ID | ACC_ID |
| ------ | ---- | ------ | ------ |
| 1234   | CRDR | ABC123 | AB1234 |
| 1234   | DBTR | XYZ222 | XY9800 |
| 9876   | CRDR | EFG999 | EF7659 |
| 9876   | DBTR | ABC123 | AB9900 |

预期结果:

Table: REPORT
| TRX_ID | Counterparty FAC_ID | Counterparty ACC_ID |
| ------ | ------------------- | ------------------- |
| 1234   | XYZ222              | XY9800              |
| 9876   | EFG999              | EF7659              |

需要的逻辑: 如果 FAC_ID NOT LIKE 'ABC%' 则参考交易对手 FAC_ID(例如对于 TRX_ID = 1234,它将参考 DBTR FAC_ID 和 DBTR ACC_ID; TRX_ID = 9876, 会引用CRDR FAC_ID AND CRDR ACC_ID)

示例:

SELECT (CASE WHEN TYPE = 'DBTR' AND FAC_ID LIKE 'ABC%' THEN (SELECT FAC_ID FROM ACCOUNT_DETAILS WHERE TYPE = 'CRDR') 
ELSE (SELECT FAC_ID FROM ACCOUNT_DETAILS WHERE TYPE = 'DBTR') END)
FROM ACCOUNT_DETAILS

我已经尝试过 JOIN、UNION 和子查询等选项,但它不起作用。我想在查询中将交易对手 FAC_ID 和交易对手 ACC_ID 放在单独的单行中,因为我会将其包含在我已经拥有的长查询中。

我们可以在 CTE 中使用 CASE 来标记 FAC_ID 不以“ABC”开头的行,然后在 WHERE 子句中使用该标记。
请参阅 db<>fiddle here 架构。

with cte as 
(
select 
TRX_ID,
FAC_ID,
ACC_ID,
CASE WHEN FAC_ID LIKE 'ABC%' THEN 0 ELSE 1 END ordinal
FROM ACCOUNT_DETAILS)
SELECT
TRX_ID,
FAC_ID,
ACC_ID
FROM CTE
WHERE ordinal = 1;
TRX_ID | FAC_ID | ACC_ID
-----: | :----- | :-----
  1234 | XYZ222 | XY9800
  9876 | EFG999 | EF7659

db<>fiddle here