найти записи в таблице, которые не связаны с другими записями в другой таблице - PullRequest
0 голосов
/ 25 мая 2018

У меня есть 3 таблицы:

list_routes
pk_route_id  route_code  route_name route_description
3              J1          IND           IND-DPS
4              J4          ADT           ADT_DPS

tbl_stu_route
pk_stu_route_id    fk_stu_cls_id   fk_route_id
2                    13               3

tbl_stu_class
pk_stu_cls_id  fk_stu_id  
 13                56

Теперь я хочу добиться запроса записи в MYSQL, который будет извлекать мне записи из списка list_routes, который не связан или не присоединен в tbl_stu_class, например, дляПриведенный выше сценарий должен дать мне вывод:

pk_route_id  route_code  route_name route_description
4              J4          ADT           ADT_DPS

Я написал следующий запрос, используя левое внешнее объединение, как

SELECT
    a.pk_route_id,
    a.route_code,
    a.route_name,
    a.route_description
FROM
    list_routes a
left outer join tbl_stu_route b on a.pk_route_id=b.fk_route_id
left outer join tbl_stu_class c on b.fk_stu_cls_id=c.pk_stu_cls_id
where c.fk_stu_id ='56'

, но вывод составил

pk_route_id  route_code  route_name route_description
3              J1          IND           IND-DPS

Я не уверен, где я иду не так.Подскажите, пожалуйста, как мне этого достичь?

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Учитывая характер вашего вопроса, я бы использовал not exists:

SELECT lr.*
FROM list_routes lr
WHERE NOT EXISTS (SELECT 1
                  FROM tbl_stu_route sr JOIN
                       tbl_stu_class c 
                       ON sr.fk_stu_cls_id = c.pk_stu_cls_id
                  WHERE lr.pk_route_id = sr.fk_route_id AND
                        c.fk_stu_id = 56
                 );

Примечания:

  • При использовании псевдонимов таблиц используйте аббревиатуры для имен таблиц.Аббревиатуры значительно упрощают выполнение запроса, чем случайные буквы.
  • Не используйте одинарные кавычки для числовых констант.Я предполагаю, что ваши идентификаторы являются числами, поэтому 56, а не '56'.
  • Я считаю, что NOT EXISTS лучше подходит для описания вашей проблемы, чем LEFT JOIN, хотя оба работают.
0 голосов
/ 25 мая 2018

Если вы хотите получить запись не существует , просто отфильтруйте с помощью IS NULL

SELECT a.*
FROM list_routes a
left outer join tbl_stu_route b on a.pk_route_id=b.fk_route_id
left outer join tbl_stu_class c on b.fk_stu_cls_id=c.pk_stu_cls_id
where b.fk_route_id is null;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...