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
甲骨文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