powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Помогите с запросом исключения записей
5 сообщений из 5, страница 1 из 1
Помогите с запросом исключения записей
    #39690291
chuwees
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть 2 таблицы. Абоненты и Контракты. Все контракты уникальны и имеют статус(открыт, закрыт, архив и др.) У Абонента может быть один или несколько контрактов. Подскажите пожалуйста, как вывести Абонентов, у которых 2 и более контрактов и все со статусом закрыт.

Вот запрос, который выводит абонентов у которых несколько контрактов со статусом Закрыт:

SELECT S.CORP_NAME, S.CORP_INN
FROM CX_SEARCH S INNER JOIN CX_CONTRACT C
ON S.AGRM_ID = C.ROW_ID
WHERE C.OU_TYPE_CD = 'Юридическое лицо'
AND C.X_TYPE_COMMUNICATION= 'Фиксированный'
AND C.CUST_STAT_CD = 'Закрыт'
GROUP BY S.CORP_NAME, S.CORP_INN
HAVING COUNT (S.CORP_NAME) > 1
...
Рейтинг: 0 / 0
Помогите с запросом исключения записей
    #39690294
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chuwees,

либо [not] exists-подзапрос
либо считать агрегацию по всем данным, фильтруя статусы в HAVING (через case/decode)
...
Рейтинг: 0 / 0
Помогите с запросом исключения записей
    #39690512
chuwees
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Щукина Анна,
Спасибо большое за наводку.
...
Рейтинг: 0 / 0
Помогите с запросом исключения записей
    #39691519
Popipo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прежде чем задавать такие вопросы, хорошо бы предоставить отношение между таблицами, существующие индексы, тестовые данные и ожидаемый результат. Предположим, что C.ROW_ID это не уникальный ключ, а указатель на абонента

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
with contract_id as (
  select ROW_ID from (
    select ROW_ID,
    CASE WHEN CUST_STAT_CD = 'Закрыт' THEN 1 ELSE 0 END AS closed,
    CASE WHEN CUST_STAT_CD != 'Закрыт' THEN 1 ELSE 0 END AS opened
    from CX_CONTRACT) G
  group by ROW_ID
--   получаем id абонентов у которых открытых 0, а закрытых больше 1
  having opened_c = 0 and closed_c > 1
)
select CORP_NAME, CORP_INN FROM CX_SEARCH where AGRM_ID in (contract_id)
...
Рейтинг: 0 / 0
Помогите с запросом исключения записей
    #39691708
chuwees
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Popipo, Да, косяк. Не судите строго, я только учусь) Оказалось так, как ты сказал. И мой запрос неправильный. Таблица CX_CONTRACT - дочерняя, а CX_SEARCH - родительская. Я написал такой запрос и вроде работает:

SELECT S.CORP_NAME, S.CORP_INN
FROM CX_SEARCH S
WHERE EXISTS (SELECT *
FROM CX_MTS_CONTRACT C
WHERE S.ROW_ID = C.MASTER_OU_ID
AND C.CUST_STAT_CD = 'Закрыт'
GROUP BY C.MASTER_OU_ID
HAVING COUNT(*) > 1)
AND NOT EXISTS (SELECT *
FROM CX_MTS_CONTRACT C
WHERE P.ROW_ID = C.MASTER_OU_ID
AND C.CUST_STAT_CD <> 'Закрыт')


Обязательно попробую твой способ в целях повышения скила. Большое спасибо
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Помогите с запросом исключения записей
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]