Supondo que eu tenha a seguinte consulta PostgreSQL:
SELECT (
SELECT SUM (t.customers)
FILTER (
WHERE id = 1
AND date
BETWEEN %(start)s AND %(stop)s
) +
SELECT SUM (t.employees)
FILTER (
WHERE id = 1
AND date
BETWEEN %(start)s AND %(stop)s
)
FROM table t;
e quero duplicar o resultado para que a tabela retornada tenha três colunas. Devo copiar a subconsulta três vezes, separadas por vírgula? Essa parece uma maneira confusa de fazer isso e não é a ideal, pois a consulta seria realizada três vezes (?). Prefiro dar um alias, digamos eaters
, à consulta e escrever uma nova consulta retornando o alias três vezes:
-- The SELECT above AS eaters and then:
SELECT (
SELECT * FROM eaters, SELECT * FROM eaters, SELECT * FROM eaters
);
Isso deve estar ok também em termos de desempenho, eu acho. Existe alguma outra maneira eficaz de duplicar os n
tempos de resultado dentro da consulta principal?
Consulto os dados do restaurante escolar divididos em três partes: resultado total, resultado sem bebidas e apenas as bebidas. O número de consumidores (= clientes + funcionários) será apresentado em cada tabela de resultados e é sempre o mesmo para as três colunas. Obviamente existe o mesmo número de clientes, independentemente da parte considerada. Então preciso do mesmo valor três vezes. É claro que eu poderia substituir os seguintes valores por texto, 'igual ao total' etc., e isso seria entendido. Mas prefiro aprender sobre isso e apresentar os números.
EDIT: usando CTEs eu criaria esse tipo de consulta:
WITH customers AS (
SELECT SUM (customers)
FROM table
WHERE id = 1
AND date
BETWEEN %(start)s AND %(stop)s
), employees AS (
SELECT SUM (employees)
FROM table
WHERE id = 1
AND date
BETWEEN %(start)s AND %(stop)s
);
SELECT (
(SELECT * FROM customers) + (SELECT * FROM employees)
) AS eaters;
SELECT (
SELECT * FROM eaters, SELECT * FROM eaters, SELECT * FROM eaters
);
Posso não entender o problema, mas:
Se os filtros forem sempre os mesmos, talvez seja melhor movê-los para uma cláusula where:
Violino