-1
votes

Renvoie un identifiant lorsque l'ID contient des conditions dans plusieurs rangées qui doivent être remplies

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')


4 commentaires

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.


7 Réponses :


2
votes

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')


0 commentaires

2
votes

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) xxx

mais cela peut ne pas être le moyen le plus efficace d'écrire la requête. Quelque chose comme xxx

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 est "Terminé" et l'événement est "Activer" ou "Créer". Cela vous donne les deux rangées où id = 1 et unique la première ligne où id = 2 . Il les agrége ensuite par ID et compte le nombre de valeurs distinctes d'événement il y a. ID = 1 a deux événements distincts ("activate" et "Créer") afin qu'il soit renvoyé. id = 2 n'a qu'un seul événement distinct de sorte qu'il est éliminé.

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 intersect pour optimiser la compréhension du programmeur. Si vous le faites dans une section critique de performance du code, vous voudrez probablement le groupe par avec quelques commentaires expliquant ce qu'il fait.


0 commentaires

0
votes

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')


0 commentaires

0
votes

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');


0 commentaires

0
votes

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


0 commentaires

0
votes
select id from records where eventlog='activate' and 
statuslog='success' and  id in (select id from test where 
eventlog='create' and statuslog ='success');

0 commentaires

0
votes

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);


0 commentaires