我有两个表,T1
和T2
具有相同的列集。我需要发出一个查询,它将从任何一个表中返回列的值,以非空为准。如果两列都为null,则返回null作为该列的值。
列为c1
,c2
,c3,cond1。
我发出了以下查询。问题是如果一个子查询失败,整个查询将失败。有人请帮帮我。可能还有另一种简单的方法。
SELECT NVL(T1.c1, T2.c1) c1,NVL(T1.c2, T2.c2) c2,NVL(T1.c3, T2.c3) c3
FROM (SELECT c1,c2,c3
FROM T1
WHERE cond1 = 'T10') T1
,(SELECT c1,c2,c3
FROM T2
WHERE cond1 = 'T200') T2 ;
答案 0 :(得分:0)
你需要这样的东西:
SELECT NVL((SELECT T1.c1
FROM T1
WHERE T1.c2 = 'T10'),
(SELECT T2.c1
FROM T2
WHERE T2.c2 = 'T200')) AS c1
FROM dual
或者您可能更喜欢full outer join:
SELECT NVL(T1.c1, T2.c1) AS c1 FROM T1 FULL OUTER JOIN T2 ON 1=1 WHERE T1.c2 = 'T10' AND T2.c2 = 'T200'
您的结果是合乎逻辑的。如果第一个表为null,则natural join中不存在任何值组合。
修改即可。在一些新要求之后,我们可以使用hack来获取行。让我们获得所有三种可能性,T1,T2或所有空值并选择第一个:
SELECT * FROM ( (SELECT T1.* FROM T1 WHERE T1.c2 = 'T10') UNION ALL (SELECT T2.* FROM T2 WHERE T2.c2 = 'T200') UNION ALL (SELECT T2.* FROM dual LEFT JOIN T1 ON 1 = 0 ) ) WHERE ROWNUM = 1