On ne sait pas très bien si la colonne de version entre en jeu ou non. Par exemple, voulez-vous seulement considérer les lignes avec la plus grande version ou si n'importe quel sous-élément a un "A" devrait-il compter. Prenez 5678, BB par exemple, où la version 1 a un "A" et la version 0 a un "B". Est-ce que 5678 est inclus parce qu'au moins un sous-code BB a un "A" ou est-ce parce que la version 1 a un "A".
Le code suivant suppose que vous voulez tous les codes où chaque sous-code a au moins un "A" indépendamment de la version.
SELECT
T1.code,
T1.subcode,
T1.version,
T1.status
FROM
MyTable T1
WHERE
(
SELECT COUNT(DISTINCT subcode)
FROM MyTable T2
WHERE T2.code = T1.code
) =
(
SELECT COUNT(DISTINCT subcode)
FROM MyTable T3
WHERE T3.code = T1.code AND T3.status = 'A'
)
Les performances peuvent être abyssales si votre table est grande. Je vais essayer de trouver une requête qui est susceptible d'avoir de meilleures performances, car c'était hors de ma tête.
En outre, si vous expliquez toute l'étendue de votre problème, nous pouvons peut-être trouver un moyen de se débarrasser de cette table temp ...;)
Voici deux méthodes plus possibles. Encore beaucoup de sous-requêtes, mais elles ont l'air d'être plus performantes que la méthode ci-dessus. Ils sont tous les deux très similaires, bien que le second ait un meilleur plan de requête dans ma base de données. Bien sûr, avec des données limitées et aucune indexation, ce n'est pas un bon test. Vous devriez essayer toutes les méthodes et voir ce qui est le mieux pour votre base de données.
SELECT
T1.code,
T1.subcode,
T1.version,
T1.status
FROM
MyTable T1
WHERE
EXISTS
(
SELECT *
FROM MyTable T2
WHERE T2.code = T1.code
AND T2.status = 'A'
) AND
NOT EXISTS
(
SELECT *
FROM MyTable T3
LEFT OUTER JOIN MyTable T4 ON
T4.code = T3.code AND
T4.subcode = T3.subcode AND
T4.status = 'A'
WHERE T3.code = T1.code
AND T3.status <> 'A'
AND T4.code IS NULL
)
SELECT
T1.code,
T1.subcode,
T1.version,
T1.status
FROM
MyTable T1
WHERE
EXISTS
(
SELECT *
FROM MyTable T2
WHERE T2.code = T1.code
AND T2.status = 'A'
) AND
NOT EXISTS
(
SELECT *
FROM MyTable T3
WHERE T3.code = T1.code
AND T3.status <> 'A'
AND NOT EXISTS
(
SELECT *
FROM MyTable T4
WHERE T4.code = T3.code
AND T4.subcode = T3.subcode
AND T4.status = 'A'
)
)
Cela ne renvoie pas les résultats corrects. 5678 sera exclu car au moins une ligne existe avec un statut non "A". –