Estou construindo uma tabela de configuração e quero que uma linha seja o valor padrão. Por exemplo, tenho uma list
tabela com todos os meus bancos de dados e uma tabela chamada msg
que contém todos os meus valores de retorno. Na msg
tabela, tenho uma linha que é 'alldbs' e quero esse valor retornado se não houver outra linha para o banco de dados associado.
Então a saída deve ser:
--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
Agora posso obter o resultado, mas a consulta é desajeitada e parece que deve haver uma maneira melhor:
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'
Existe uma maneira mais eficiente de escrever essa consulta?
Link SQLFiddle usando SQL 2014.
Usando outro
left join
:ou uma
cross
junção (isso requer'alldbs'
a presença de uma linha, caso contrário, retornará 0 resultados.):SQlfiddleGenericName
Ambas as consultas assumem que há apenas uma linha com
dbname = 'alldbs'
. Caso contrário, use aapply
versão fornecida por AndriyM.Outra maneira (não tão bonita para mim depois de ver a sugestão de @ypercube, mas ainda assim...):
Usando uma subseleção para obter a mensagem ausente: