J'essaie d'écrire une requête qui renvoie des identifiants qui ont satisfait des conditions de plusieurs lignes à l'aide de différentes valeurs pour la même colonne. Par exemple,
select ID, EVENT, STATUS from EOMSCHEMA.AUDIT_RECORDS where (event = 'Activate' and status = 'Completed') and (event = 'Create' and status= 'Completed')
7 Réponses :
C'est ce que vous voulez:
select ID, EVENT, STATUS from EOMSCHEMA.AUDIT_RECORDS where event = 'Activate' and status = 'Completed' and ID IN(SELECT ID FROM EOMSCHEMA.AUDIT_RECORDS WHERE event = 'Create' and status= 'Completed')
Personnellement, je trouverais quelque chose comme celui-ci le plus facile à lire et à comprendre (donnez-moi tout de la première requête qui est également dans la deuxième requête) mais cela peut ne pas être le moyen le plus efficace d'écrire la requête. Quelque chose comme p> peut être plus efficace. Mais ce n'est peut-être pas aussi évident que ce qu'il fait. Logiquement, il s'agit de toutes les lignes où le statut code> est "Terminé" et l'événement code> code> est "Activer" ou "Créer". Cela vous donne les deux rangées où Si vous écrivez une requête qui doit être exécutée occasionnellement et des volumes de données Aren 'T trop grand, je préférerais que l'approche code> intersect code> pour optimiser la compréhension du programmeur. Si vous le faites dans une section critique de performance du code, vous voudrez probablement le groupe id = 1 code> et unique la première ligne où id = 2 code>. Il les agrége ensuite par ID code> et compte le nombre de valeurs distinctes d'événement code> il y a. ID = 1 code> a deux événements code> distincts code> ("activate" et "Créer") afin qu'il soit renvoyé. id = 2 code> n'a qu'un seul événement code> distinct code> de sorte qu'il est éliminé. p> par code> avec quelques commentaires expliquant ce qu'il fait. P> p>
Si vous voulez que toutes les colonnes de la table renvoyées, vous pouvez utiliser Exist deux fois:
select t.ID, t.EVENT, t.STATUS from EOMSCHEMA.AUDIT_RECORDS as t where exists (select 1 from EOMSCHEMA.AUDIT_RECORDS where ID = t.ID and event = 'Activate' and status = 'Completed') and exists (select 1 from EOMSCHEMA.AUDIT_RECORDS where ID = t.ID and event = 'Create' and status= 'Completed')
Vous pouvez le faire quelques façons:
select ID, EVENT, STATUS FROM EOMSCHEMA.AUDIT_RECORDS WHERE ID IN(SELECT ID FROM EOMSCHEMA.AUDIT_RECORDS WHERE EVENT = 'CREATE' AND STATUS = 'SUCCESS') AND ID IN(SELECT ID FROM EOMSCHEMA.AUDIT_RECORDS WHERE EVENT = 'ACTIVATE' AND STATUS= 'SUCCESS');
Selon le nombre d'enregistrements, cela pourrait être plus lent, mais devriez vous obtenir ce que vous recherchez.
Vous n'avez pas spécifié quelle version de SQL. Il s'agit de MSSQL afin que vous puissiez avoir à faire des modifications mineures. P>
SELECT COMPLETED.ID, COMPLETED.EVENT, COMPLETED.STATUS AS CompletedStatus, CREATED.STATUS as CreatedStatus FROM (SELECT ID, EVENT, STATUS from EOMSCHEMA.AUDIT_RECORDS where (event = 'Activate' and status = 'Completed') ) AS COMPLETED INNER JOIN (SELECT ID, EVENT, STATUS from EOMSCHEMA.AUDIT_RECORDS where (event = 'CREATE' and status = 'Completed') ) AS CREATED on COMPLETED.ID = CREATED.ID
select id from records where eventlog='activate' and statuslog='success' and id in (select id from test where eventlog='create' and statuslog ='success');
quelque chose sur ces lignes ..
select * from audit_records
where id in (select id
from audit_records
group by id
having avg(case when status = 'Success' then 1 else 0 end) = 1);
Spécifiez également le résultat attendu.
Cela ne voudrait-il que vérifier 1 condition et non l'autre?
Tu es trop vite ...
Le problème avec votre code est qu'il est à la recherche d'une ligne pour avoir un événement d'activation et de création. Vous devez les avoir comme des contrôles séparés.