Clause SQL where utilise MAX Date d'entrée en vigueur et les valeurs NULL
Je suis en utilisant une interface logiciel pour exécuter SQL sur Oracle. J'ai besoin de récupérer la dernière ligne basé sur la date d'entrée en vigueur.
Voici un exemple de tableau
Table "ACCOUNTS"
Application | Sub_category | Account_Reference | Effective_date
BC_ONLINE | F | ABC1234 | 01-JAN-13
BC_ONLINE | B | ABC2345 | 01-JAN-13
TE_Notice | (NULL) | 1234ABC | 01-JAN-13
TE_Notice | (NULL) | 9876DEF | 01-APR-13
Le logiciel va passer deux paramètres: l'Application et Sub_category, si j'ai utilisé le code SQL suivant, sur la Demande suivante: BC_ONLINE et Sub_category: F
select a.Account_Reference
from ACCOUNTS a
where a.Application = 'BC_ONLINE'
and a.Sub_category = 'F'
and a.Effective_date = (select max(b.Effective_date)
from ACCOUNTS b
where b.Effective_date <= sysdate
and b.Application = a.Application
and b.Sub_category = a.Sub_category)
MAIS dois-je utiliser l'Application suivante: TE_Notice et Sub_category: NULL
et vous ne pouvez pas avoir ce
and a.Sub_category = null
car il doit être
and a.Sub_category is null
le problème est que le logiciel est fixe, alors quel est le meilleur moyen d'utiliser à la fois la valeur et la valeur null dans la clause where à l'aide de max(effective_date)?
J'ai essayé cette méthode, mais il ne fonctionne pas
select a.Account_Reference
from ACCOUNTS a
where a.Application = 'TE_Notice'
and (a.Sub_category = '' or a.Sub_category is null)
and a.Effective_date = (select max(b.Effective_date)
from ACCOUNTS b
where b.Effective_date <= sysdate
and b.Application = a.Application
and NVL(b.Sub_category,-1) = NVL(a.Sub_category,-1))
Il simplement retourné la ligne avec 01-AVR-13, mais je devrais être en train de la ligne avec la Effective_date sur 01-JAN-13.
- Votre question me donne
1234ABC
, qui est le01-JAN-13
compte de référence, donc pas sûr de ce que le problème est. Cependant, je pense que la quatrième ligne devrait êtreand (a.Sub_category = '' or ('' is null and a.Sub_category is null))
bien comparer - sinon, si vous passez une valeur non nulle, il va toujours correspondre à des valeurs nulles dans les données. - Maintenant, je sais où j'allais mal - j'ai raté le
<= sysdate
! mais @AlexPoole, vous avez raison, la quatrième ligne de l'amélioration est nécessaire. J'ai été préoccupé par ce, ne savait pas comment le meilleure expression de cette ligne. L'apprécier. - Quel est le résultat attendu? Une seule ligne avec max date ou plus...?
- Le résultat attendu est une seule ligne avec le max de date <= sysdate.
Vous devez vous connecter pour publier un commentaire.
Comment sur:
a.Sub_category is NULL
? C'est un fixe logiciel d'application, de sorte que le SQL devrait fonctionner pour les deux cas;a.Sub_category = 'F'
oua.Sub_category is null
order by ... desc
signifie la dernière ligne correspondante sera retourné premier, donc c'est de la manipulation de données plus anciennes. Mais il est absent de lasysdate
case pour exclure des futures lignes - qui est trivial à rajouter dans bien que.Avec grâce à @AlexPoole le SQL, j'ai mis dans la question est en fait correct, mais besoin de polissage.
Si j'ai adopté le suivant:
Le sélectionnez aller chercher lignes nulles ainsi que la valeur non nulle, donc besoin de s'améliorer;
L'ensemble de SQL doit être
sysdate
vérification et la modification de lasub_category
vérifier. (Et l'ensemble de vos SQL manque une parenthèse fermante à la ligne 4 *8-)