Запрос на получение нескольких номеров клиентов для одного пользователя в таблице пользователей

В нашей авиационной отрасли нам необходимо узнать более одного номера клиента для одного входа в таблицу AIR_USER. Структура таблицы приведена ниже.

ROW_ID АВТОРИЗОВАТЬСЯ CUST_NUM ПОЛНОЕ ИМЯ 1-3EW СУНИЛК 3001 СУНИЛ КУМАР 1-3кв.л. СУНИЛК 3002 СУНИЛ КУМАР 1-4ФВ ДИЛИПК 1001 ДИЛИП КУМАР 1-5ТФ ДИЛИПК 1003 ДИЛИП КУМАР 1-4ВХ РАВИП 2002 г. РАВИ ПРАДИП

Я использовал приведенный ниже запрос, но он занимает огромное время, поскольку стоимость и мощность исчисляются тысячами. Кроме того, в этой таблице почти миллион записей, поскольку она содержит всю информацию о пользователе.

SELECT 
  DISTINCT LOGIN, CUST_NUM, COUNT(CUST_NUM) 
FROM AIR_USER 
GROUP BY 
  LOGIN, CUST_NUM 
HAVING COUNT(CUST_NUM) > 1 
ORDER BY LOGIN;

Не могли бы вы помочь, если этот запрос правильный? Если верно, не могли бы вы помочь уточнить запрос.

Запрос на получение нескольких номеров клиентов для одного пользователя в таблице пользователей

Запрос выглядит нормально. Хотя вы выполняете подсчет два раза, но я не знаю, можно ли это сделать лучше. У вас должны быть индексы для входа в систему и CUT_NUM, а также комбинированный индекс для LOGIN_CUST_NUM. Итак, как выглядит ваша структура таблицы, есть ли индексы? Индексы значительно повышают производительность. Без структуры таблицы было бы сложно сказать, почему снижается производительность. А также нагрузка на ваш сервер. Сильная ли нагрузка на сервер. На какой машине он запускается? Используете ли вы SSD в качестве жесткого диска? Возможно, понадобится конфигурация Oracle.

Kilian Hertel 25.04.2024 11:37

Пожалуйста, не используйте здесь местные слова. Люди из других стран понятия не имеют, что означает is into lakhs.

James Z 25.04.2024 14:46
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
2
76
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Не используйте DISTINCT и GROUP BY в одном (под) запросе. GROUP BY вернет одну строку для каждой группы, поэтому DISTINCT бессмысленно.

Вы также не хотите включать CUST_NUM в GROUP BY:

SELECT LOGIN,
       LISTAGG(CUST_NUM, ',') WITHIN GROUP (ORDER BY cust_num) AS cust_nums,
       COUNT(CUST_NUM) 
FROM   AIR_USER 
GROUP BY LOGIN
HAVING COUNT(CUST_NUM) > 1 
ORDER BY LOGIN

Что для примера данных:

CREATE TABLE air_user (ROW_ID, LOGIN, CUST_NUM, FULL_NAME) AS
SELECT '1-3EW', 'AMAJAK', 3001, 'AMAJA KUMAR'  FROM DUAL UNION ALL
SELECT '1-3QL', 'AMAJAK', 3002, 'AMAJA KUMAR'  FROM DUAL UNION ALL
SELECT '1-4FV', 'BEEJAK', 1001, 'BEEJA KUMAR' FROM DUAL UNION ALL
SELECT '1-5TF', 'BEEJAK', 1003, 'BEEJA KUMAR' FROM DUAL UNION ALL
SELECT '1-4BX', 'CHARAP',  2002, 'CHARA PRADEEP' FROM DUAL;

Выходы:

АВТОРИЗОВАТЬСЯ CUST_NUMS COUNT(CUST_NUM) АМАДЖАК 3001,3002 2 БИДЖАК 1001,1003 2

или, если вы не хотите перечислять cust_num и хотите знать только login, вы можете упростить запрос:

SELECT LOGIN
FROM   AIR_USER 
GROUP BY LOGIN
HAVING COUNT(CUST_NUM) > 1 
ORDER BY LOGIN

Выходы:

АВТОРИЗОВАТЬСЯ АМАДЖАК БИДЖАК

рабочий пример

Если вы ищете LOGIN, который имеет более одного CUST_NUM, чем вам следует использовать
HAVING COUNT(Distinct CUST_NUM) > 1
как ниже:

SELECT LOGIN
FROM   AIR_USER 
GROUP BY LOGIN
HAVING COUNT(Distinct CUST_NUM) > 1 

... без ключевого слова Distinct будет учитываться несколько вхождений одного и того же CUST_NUM в качестве другого.
Если вы выполняете запрос к большому набору данных, возможно, вы могли бы проверить производительность предложения MODEL. Не уверен, но по моему опыту зачастую это оказывалось быстрее, чем другие варианты. Попробуйте и посмотрите, быстрее это или нет.

Select LOGIN
From  ( SELECT  LOGIN, CNT
        FROM  ( SELECT ROWNUM "RN", LOGIN, CUST_NUM, 0 "CNT"
                FROM   AIR_USER
              )
              MODEL Partition By (LOGIN)
                    Dimension By (RN)
                    MEASURES (CUST_NUM, CNT)
              RULES ( CNT[ANY] = Count(DISTINCT CUST_NUM)[RN <= CV()] )
        )
Where CNT = 2

Другие вопросы по теме