Preciso de uma consulta selecionada de duas tabelas Car
e CarImage
. Haverá várias imagens para cada carro. Quero retornar a contagem total de imagens e o nome da imagem apenas para a primeira imagem ( DisplayOrder = 1
) de cada carro, mas adicionar esta cláusula where resulta na contagem de imagens sempre igual a um. Como posso retornar a contagem total de imagens e o nome da imagem apenas da primeira imagem de cada carro?
Minha consulta simplificada fica assim:
SELECT c.Id,
c.Make,
c.Model,
ci.ImageName,
COUNT(ci.ImageName) AS ImageCount
FROM Car c
JOIN CarImage ci
ON c.Id = ci.CarId
WHERE ci.DisplayOrder = 1
GROUP BY (ci.ImageName) <-- usually need some kind of `GROUP BY` to get count
É um pouco desajeitado, mas você pode chegar lá com agregação condicional. Porque nulo sempre será menor que não nulo.
Para se divertir, aqui está outra opção usando a
first_value()
função de janelamento:Veja como funciona aqui:
A vantagem aqui é que ele ainda pegará corretamente a primeira imagem com base em
DisplayOrder
, mesmo que algo faça com que a numeração comece em algum lugar diferente de 1 .Parece que também deveria haver uma maneira de fazer isso usando uma junção lateral (
APPLY
), mas não estou vendo isso imediatamente sem precisar daCarImage
tabela em ambas as camadas, o que significa que é improvável que seja muito eficiente.Você pode usar subconsulta
Você pode usar subconsulta para isso: