在Oracle中,如果子查询返回一行,则可以在select语句中返回一个子查询,如果子查询没有返回一行,则返回null ?
示例:
SELECT X,
Y,
Z,
(SELECT W FROM TABLE2 WHERE X = TABLE1.X) /* but return null if 0 or more than 1 rows is returned */
FROM TABLE1;
谢谢!
答案 0 :(得分:5)
如何以不同的方式进行呢?使用子查询的简单LEFT OUTER JOIN应该可以执行您想要的操作:
SELECT T1.X
,T1.Y
,T1.Z
,T2.W
FROM TABLE1 AS T1
LEFT OUTER JOIN (
SELECT X
,W
FROM TABLE2
GROUP BY X,W
HAVING COUNT(X) = 1
) AS T2 ON T2.X = T1.X;
这将仅返回具有正好1个X实例的项目,并且在适当时将LEFT OUTER JOIN返回到表中(使非匹配为NULL)。
这也符合ANSI标准,因此效果非常好。
答案 1 :(得分:1)
除了CASE
解决方案或将内联子查询重写为外部联接之外,如果您可以在{{1上应用聚合函数(MIN
或MAX
),这将有效。专栏:
W
答案 2 :(得分:0)
SELECT
X, Y, Z, (SELECT W FROM TABLE2 WHERE X = TABLE1.X HAVING COUNT(*) = 1)
FROM
TABLE1;
答案 3 :(得分:0)
我的回答是:不要使用子选择(除非你确定......)
没有必要也不是一个好主意在这里使用一个subselect,因为PlantTheIdea提到了两件事
的解释:
subselect意味着:
为主要选择结果集的每一行选择一个。即如果你得到1000行,你的数据库系统中也会得到1000(小)选择状态(忽略优化器)
和(!)
使用子选择,您很有可能隐藏(或覆盖)繁重的数据库或选择问题。这意味着:您只期望没有(NULL)或一个(确切)行(两者都可以通过[left outer] join轻松解析)。如果您的子选择中有多个错误,则SQL错误指出
“HAVING COUNT(X)= 1”当然是正确的,有小问题(或不小),那就是:“为什么有一个以上的行?”
我花了几个小时的时间找到像这样的工作场所,最后“如果你真的确定......就不要这样做”
我看到与“喜欢”相反的情况
...
HAVING date=max(date) -- depends on sql dialect
或
where date = select max(date) from same_table
并且在我的上一个例子中我再次指出:如果你在这里有多行(从今天开始;。)你有数据库问题 - 你可以使用时间戳代替例如