Dada a consulta abaixo, pode haver várias linhas em dps_markers com a mesma chave do marcador, mas queremos unir apenas com a primeira. Se eu pegar esta consulta e remover o primeiro e ORDER BY, obtenho um valor para mbg.marker_value, mas executado como está, sempre retorna nulo
SELECT u.id, mbg.marker_value
FROM dps_user u
LEFT JOIN
(SELECT TOP 1 m.marker_value, um.profile_id
FROM dps_usr_markers um (NOLOCK)
INNER JOIN dps_markers m (NOLOCK)
ON m.marker_id= um.marker_id AND
m.marker_key = 'moneyBackGuaranteeLength'
ORDER BY m.creation_date
) MBG ON MBG.profile_id=u.id
WHERE u.id = 'u162231993'
sql-server
outer-join
dstarh
fonte
fonte
A chave para depurar situações como essas é executar a subconsulta / visualização em linha por conta própria para ver qual é o resultado:
Executando isso, você veria que o
profile_id
valor não corresponde aou.id
valor deu162231993
, o que explicaria por que todas asmbg
referências retornariamnull
(graças à junção à esquerda; você não obteria nada se fosse uma junção interna).Você se codificou em um canto usando
TOP
, porque agora você tem que ajustar a consulta se quiser executá-la para outros usuários. Uma abordagem melhor seria:Com isso, você pode alterar o
id
valor dawhere
cláusula para verificar os registros de qualquer usuário do sistema.fonte
Porque a
TOP 1
partir da subconsulta ordenada não temprofile_id = 'u162231993'
Removerwhere u.id = 'u162231993'
e ver os resultados então.Execute a subconsulta separadamente para entender o que está acontecendo.
fonte
Damir está correto,
Sua subconsulta precisa garantir que dps_user.id seja igual a um.profile_id, caso contrário, ela agarrará a linha superior que pode, mas provavelmente não é igual ao seu id de 'u162231993'
Sua consulta deve ser semelhante a esta:
fonte
WHERE um.profile_id = 'u162231993'
na subconsulta eWHERE mbg.marker_value IS NOT NULL
do lado de fora.@SearchFor = 'u162231993'
e então use-aWHERE
, ou poste alguns dados e estruturas de tabela para que outras pessoas possam ajudar e experimentar.