Немного неясно, вступит ли в игру колонка версий. Например, хотите ли вы рассматривать только строки с самой большой версией или если ЛЮБОЙ подкадр имеет «А», если он считается. Возьмите 5678, например, BB, где версия 1 имеет «A», а версия 0 имеет «B». Включен ли 5678, потому что хотя бы один из подкодов BB имеет «A», или это потому, что в версии 1 есть «A».
В следующем коде предполагается, что вам нужны все коды, в которых каждый субкод имеет хотя бы одну букву «A» независимо от версии.
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'
)
Производительность может быть ужасной, если у вас большой стол. Я попытаюсь придумать запрос, который, вероятно, будет иметь лучшую производительность, так как это было у меня в голове.
Кроме того, если вы объясните в полной мере вашу проблему, возможно, мы сможем найти способ избавиться от этой временной таблицы ...;)
Вот еще два возможных метода. Еще много подзапросов, но они выглядят так, как будто будут работать лучше, чем описанный выше метод Они оба очень похожи, хотя у второго здесь был лучший план запросов в моей БД. Конечно, с ограниченными данными и отсутствием индексации это не очень хороший тест. Вы должны попробовать все методы и посмотреть, какой из них лучше всего подходит для вашей базы данных.
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'
)
)