我有一种感觉,有一个更好的方法来做这件事,但它并没有出现在脑海中,我猜我会觉得我会觉得像个白痴后,建议。关键是子查询中的完全外部联接。我有一个父表,它有三个使用相同外键的子表。如果其中一个子表具有数据,则其他两个子表不应该具有与同一个父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结果应该包含子表中的每一行。
提前谢谢。
发布于 2013-11-12 21:08:23
你可以做一些很简单的事情,比如联盟
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子句即可。
发布于 2013-11-12 21:08:14
这个怎么样?
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.IDhttps://stackoverflow.com/questions/19939818
复制相似问题