Отображение имени пользователя и города, которые забронировали билеты, не используя банк HDFC для каких-либо заказов - PullRequest
0 голосов
/ 21 апреля 2019

Отображение имени пользователя и его города, которые забронировали билеты, не используя банк HDFC для каких-либо бронирований.Сортировать результат по имени пользователя.

Это схема Это мой код.

select distinct u.name,u.address
    from users u join bookingdetails b on b.user_id=u.user_id
    where lower(b.name) !='hdfc'
    order by u.name;

Я получаю ожидаемый вывод, но передаю только одно изтестовые наборы (тестовые наборы не видны, так как они показывают только успех или неудачу).Я думаю, что этот запрос может быть написан более эффективно.

Данные для таблицы пользователей.

NAME                    USER_ID ADDRESS  
------------------- ---------- --------- 
Jaya                          6 Chennai  
Krena                         5 Mumbai   
Johan                         4 Delhi    
Ivan                          3 Chennai  
Tom                           2 Hyderabad
John                          1 Bangalore

Данные для таблицы bookingdetails.

  BD_ID     ACC_NO  NAME          USER_ID    
  -------   ------ ----          ---------
   1001       1234 SBI                 1    
   1002       5623 KVB                 5    
   1003       9876 ICICI               4    
   1004       9193 HDFC                2    
   1005       8397 HDFC                3    
   1006       1234 SBI                 1   

ожидаетсяoutput:

 NAME                 ADDRESS
 ----------------     ----------
    Johan              Delhi
    John               Bangalore
    Krena              Mumbai

Кроме того, это вывод (указанный выше) вашего отредактированного запроса, и он также проходит только один тестовый пример.

Ответы [ 2 ]

2 голосов
/ 21 апреля 2019

Поскольку вам нужны только столбцы одной таблицы (users), вы можете преобразовать запрос в NOT EXISTS

select u.name,u.address
    from users u where not exists 
    ( select 1 from bookingdetails b 
      where b.user_id=u.user_id
         and lower(b.name) ='hdfc'
    ) order by u.name;

Кроме того, добавление lower() может снизить производительность, если объем данныхвысокий и не может использовать индекс, если он существует по имени.Таким образом, в сценарии реального времени (в отличие от назначения, которое вы в настоящее время пытаетесь выполнить), либо сохраняйте имена в одном регистре (либо в нижнем, либо в верхнем регистре), либо используйте индекс на основе функций для lower(name).

РЕДАКТИРОВАТЬ : Если вы хотите исключить пользователей, которых нет в деталях бронирования, вы можете использовать свой исходный запрос или существующее условие.

select u.name,u.address
    from users u where exists 
    ( select 1 from bookingdetails b 
      where b.user_id=u.user_id
         and lower(b.name) != 'hdfc'
    ) order by u.name;

DEMO

0 голосов
/ 22 апреля 2019
select distinct u.name, u.address from users u
join bookingdetails b on b.user_id = u.user_id
where u.user_id not in 
( select user_id from bookingdetails where name='HDFC')
order by u.name;

Надеемся, что вы пройдете оба теста.И добро пожаловать в Accenture!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...