Veja abaixo Eu não obtenho uma linha para cada estatística
Esta junção à esquerda age como uma junção interna
Eu obtenho 6 linhas e espero 9
Eu quero 3 linhas para cada nome (dados nulos se não houver correspondência)
Como corrigir isso?
declare @table table (name varchar(10), status int, data int);
insert into @table values
('a', 1, 2)
, ('a', 2, 5)
, ('a', 3, 7)
, ('b', 1, 5)
, ('b', 2, 6)
, ('c', 1, 3)
select stats.status as statusStats
, t.status as statusData, t.name, t.data
from (values (1),(2),(3)) as stats(status)
left join @table t
on t.status = stats.status
Saída desejada
('a', 1, 2)
, ('a', 2, 5)
, ('a', 3, 7)
, ('b', 1, 5)
, ('b', 2, 6)
, ('b', 3, null)
, ('c', 1, 3)
, ('c', 2, null)
, ('c', 3, null)
Você provavelmente está esperando um produto cartesiano entre valores name
e status
. Bem, azar - o SQL não pode "adivinhar" isso, você tem que introduzir a multiplicação manualmente:
select stats.status as statusStats, t.status as statusData, t.name, t.data
from (values (1),(2),(3)) stats(status)
cross join (values ('a'),('b'),('c')) names(name)
left join @table t
on t.status = stats.status
and t.name = names.name;
Este artigo é coletado da Internet.
Se houver alguma infração, entre em [email protected] Delete.
deixe-me dizer algumas palavras