je sélectionne des données agrégées et de regroupement à la date et un domaine particulier. Je veux afficher toutes les valeurs dans ce champ et un nombre de ces valeurs même s'il n'y avait pas de données correspondant à ce champ ce jour-là. Par exemple.suppression de sous-requête supplémentaire dans le tableau Oracle, en sélectionnant des valeurs
Date MyField Count
2009-09-25 A 2
2009-09-25 B 0
2009-09-24 A 1
2009-09-24 B 1
SQL Oracle J'ai actuellement à faire est semblable à ce qui suit:
SELECT today,
mytable.myfield,
COUNT(
CASE WHEN fields.myfield = mytable.myfield AND
date >= today AND
date < tomorrow
THEN 1
END
)
FROM (
SELECT TRUNC(SYSDATE) + 1 - LEVEL AS today,
TRUNC(SYSDATE) + 2 - LEVEL AS tomorrow
FROM DUAL
CONNECT BY LEVEL <= 30
),
(
/* This is the part that seems inefficient */
SELECT DISTINCT myfield
FROM mytable
WHERE myfield IN ('A', 'B')
) fields,
mytable
GROUP BY today, mytable.myfield
ORDER BY today DESC, mytable.myfield ASC
Mon souci est que je sais exactement quels sont les valeurs que je veux afficher pour myfield
, et il semble inefficace avez une requête SELECT
qui accède à mytable
. Je me demandais s'il y a une certaine façon que je pouvais faire quelque chose comme ça dans cette sous-requête:
SELECT ('A', 'B') AS myfield
FROM DUAL
J'utilise une ancienne version d'Oracle où les clauses WITH
ne fonctionnent pas.
Quelle version d'Oracle utilisez-vous? Le niveau de connexion ne fonctionne pas dans Oracle 8, donc vous utilisez Oracle 9 ou 10. Mais Oracle 9 et 10 ont la clause with, vous devriez donc pouvoir utiliser la clause with. – tuinstoel
CONNECT PAR NIVEAU fonctionne vraiment, mais les clauses n'ont pas travaillé dans l'interface que je utilise pour accéder à la base de données de mon entreprise. Je ne suis pas sûr de la version d'Oracle. –
Sélectionnez * à partir de la version v $ pour connaître le type de version Oracle que vous utilisez. – tuinstoel