web-dev-qa-db-fra.com

Utilisation conjointe de union et count (*) dans une requête SQL

J'ai une requête SQL, ressemble à ceci:

select name, count (*) from Results group by name order by name

et un autre, identique qui se charge à partir d'une table de résultats d'archive, mais les champs sont les mêmes.

select name, count (*) from Archive_Results group by name order by name

Comment combiner les deux en une seule requête? (Ainsi, le groupe by fonctionnerait toujours correctement). J'ai essayé avec union all, mais cela ne fonctionnera pas. Qu'est-ce que je rate?

37
David Božjak
select tem.name, count(*) 
from(select name from results
union all
select name from archive_results) as tem
group by name
order by name
71
krdluzni

Si vous avez des index de support et des nombres relativement élevés, quelque chose comme ça peut être considérablement plus rapide que les solutions suggérées:

SELECT name, MAX(Rcount) + MAX(Acount) as TotalCount
FROM (
  SELECT name, count(*) as Rcount, 0 as Acount
  FROM Results GROUP BY name
  UNION ALL
  SELECT name, 0, count(*)
  FROM Archive_Results
  GROUP BY name
) AS Both
GROUP BY name
ORDER BY name;
9
Steve Kass

Est votre objectif ...

  1. Pour compter toutes les instances de "Bob Jones" dans les deux tableaux (par exemple)
  2. Pour compter toutes les instances de "Bob Jones" dans Results sur une ligne et toutes les instances de "Bob Jones" dans Archive_Results dans une ligne distincte?

En supposant que c'est # 1, vous voudriez quelque chose comme ...

SELECT name, COUNT(*) FROM
(SELECT name FROM Results UNION ALL SELECT name FROM Archive_Results)
GROUP BY name
ORDER BY name
7
VoteyDisciple