2

我觉得有更好的方法可以做到这一点,但我没有想到我猜我会觉得在建议之后我会觉得自己像个白痴。症结是子查询中的完整外部联接。我有一个父表,它有三个使用相同外键的子表。如果其中一个子表有数据,那么其他两个子表不应该有属于同一父 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



结果应包含子表中的每一行。

提前致谢。

4

2 回答 2

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
于 2013-11-12T21:08:14.893 回答
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 子句。

于 2013-11-12T21:08:23.653 回答