Pergunta

Eu tenho uma instrução SQL semelhante a este:

SELECT COUNT(*) AS foo, SUM(foo) AS foo_sum FROM bar

Mas MySQL não permite isso porque foo é um apelido. Alguém tem uma idéia de como isso poderia ser feito em SQL?

Foi útil?

Solução

Não, você não pode usar um alias na lista de seleção ou uma cláusula WHERE. Você só pode usar o alias em um GROUP BY, HAVING ou ORDER BY.

Você também pode usar aliases definidos em uma subconsulta:

SELECT foo, SUM(foo) AS foo_sum
FROM (
  SELECT COUNT(*) AS foo
  FROM bar
);

Outras dicas

SELECT SUM(foo) as foo_sum
FROM 
(
    SELECT COUNT(*) AS foo
    FROM bar
    GROUP BY baz
)

Eu acho que não é uma boa idéia. Se você quiser fazer uma grande consulta, é melhor fazê-lo sem uma subconsulta. Use COUNT(*) e funções maiores, sem aliás, se você precisar dele.

Eu fiz uma consulta com pseudônimos e subconsultas. Demorou cerca de uma hora! Então eu reproduzida a consulta sem o alias. Ele desceu para cerca de 45 minutos. Esqueça subqueries nesta situação. É menos duro e mais bonita, mas faz sua consulta mais lento.

Eu não sei o que você está tentando fazer, mas com soluções acima você estiver executando subconsulta na tabela de alias que não é eficiente.

SELECT foo 
FROM (SELECT COUNT(*) AS foo FROM employees) AS T;

Basicamente T é a sua tabela de alias e retorna coluna foo com a contagem que é único registro e não há sentido de usar a função SUM (foo) sobre ele, pois é único registro.

De qualquer forma resposta simples:

SELECT Count(1) AS foo from employees;

Uma vez que a função COUNT irá retornar os mesmos resultados independentemente do que campo (s) NOT NULL você incluir como os parâmetros da função COUNT (ou seja: dentro dos parênteses), você pode usar COUNT (1) para obter um melhor desempenho. Agora, o motor de banco de dados não terão de buscar quaisquer campos de dados, em vez disso, vai apenas recuperar o valor inteiro de 1.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top