我觉得有一种更好的方法可以做到这一点,但我不会想到我猜想在建议之后我会觉得自己像个白痴。粘滞点是子查询中的完整外连接。我有一个父表,有三个子表使用相同的外键。如果其中一个子表具有数据,则另外两个子项不应具有与同一父ID相关的数据。父级的每一行在其中一个子表中都有一行数据。
示例数据布局,
父表:
TRANSACTION
ID
1
2
3
4
5
6
儿童表:
TRANSACTION_CH_A TRANSACTION_CH_B TRANSACTION_CH_C
T_ID_FK T_ID_FK T_ID_FK
1 null null
2 null null
null 3 null
null 4 null
null null 5
null null 6
这是我提出的查询:
SELECT * FROM TRANSACTION T
JOIN
(
SELECT
COALESCE (CH_A.T_ID_FK, CH_B.T_ID_FK, CH_C.T_ID_FK) AS T_ID
FROM IPAC_OWN.TRANSACTION_CH_A CH_A
FULL OUTER JOIN IPAC_OWN.TRANSACTION_CH_B CH_B ON CH_B.T_ID_FK = CH_A.T_ID_FK
FULL OUTER JOIN IPAC_OWN.TRANSACTION_CH_C CH_C ON CH_C.T_ID_FK = CH_A.T_ID_FK
)
CHILDREN ON CHILDREN.T_ID = T.ID
结果应包含子表中的每一行。
提前致谢。
答案 0 :(得分:0)
这个怎么样?
select
*
from
transaction t
join IPAC_OWN.TRANSACTION_CH_A CH_A ON CH_A.T_ID_FK = T.ID
union
select
*
from
transaction t
join IPAC_OWN.TRANSACTION_CH_B CH_B ON CH_B.T_ID_FK = T.ID
union
select
*
from
transaction t
join IPAC_OWN.TRANSACTION_CH_C CH_C ON CH_C.T_ID_FK = T.ID
答案 1 :(得分:0)
你可以像UNION ALL一样非常简单
SELECT T_ID_FK FROM TRANSACTION_CH_A WHERE T_ID_FK IS NOT NULL
UNION ALL
SELECT T_ID_FK FROM TRANSACTION_CH_B WHERE T_ID_FK IS NOT NULL
UNION ALL
SELECT T_ID_FK FROM TRANSACTION_CH_C WHERE T_ID_FK IS NOT NULL
如果你想在结果集中使用空值,只需从每个select语句中取出where子句。