我正在构建一个配置表并希望其中一行为默认值。例如,我有一个list
包含所有数据库的表和一个msg
包含所有返回值的表。在msg
表中,我有一行是“alldbs”,如果加入的数据库没有另一行,我希望返回该值。
所以输出应该是:
--LIST TABLE
dbname createdate
-------------------------------------------------- -----------------------
master 2015-06-23 10:05:14.363
model 2015-06-23 10:05:14.363
msdb 2015-06-23 10:05:14.363
tempdb 2015-06-23 10:05:14.363
dummy 2015-06-23 10:05:14.363
--MSG Table
dbname msgval
-------------------------------------------------- --------------------
alldbs Message 1
dummy Message 2
--DESIRED OUTPUT
dbname msgval
-------------------------------------------------- --------------------
dummy Message 2
master Message 1
model Message 1
msdb Message 1
tempdb Message 1
现在我可以得到结果,但查询很笨拙,似乎应该有更好的方法:
select
a.dbname
,b.msgval
from
list a
join msg b on a.dbname = b.dbname
union all
select
a.dbname
,b.msgval
from
list a
,msg b
where
a.dbname not in (select dbname from msg)
and b.dbname = 'alldbs'
有没有更有效的方法来编写此查询?
SQLFiddle 链接使用 SQL 2014。
使用另一个
left join
:或
cross
连接(这需要存在'alldbs'
一行,否则将返回 0 个结果。):sqlfiddle
两个查询都假设只有一行带有
dbname = 'alldbs'
. 如果没有,请使用apply
AndriyM 提供的版本。另一种方式(在看到@ypercube 的建议后对我来说不是那么漂亮,但仍然......):
使用子选择获取丢失的消息: