Предложение SQL LEFT JOIN where со сравнением IN

Возможно, вы случайно наткнулись на хороший тестовый вопрос SQL.

  • У меня есть таблица, скажем, ~ 100 имен пользователей.
  • У меня есть набор из 10 возможных имен пользователей {aname, bname, cname, dname, ...}

If I do:

SELECT user.username FROM user WHERE user.username IN ('aname', 'bname', 'cname',...);

Я получаю список выбранных имен пользователей, за вычетом тех, которые не найдены в таблице, грандиозно.

Что мне действительно нужно, так это список тех, которые НЕ найдены в таблице.

Если бы список предложений WHERE...IN был таблицей, я бы просто LEFT JOIN добавил его в пользовательскую таблицу и отфильтровал по NULLs.

Есть ли способ сделать это, не создавая временную таблицу и не присоединяя ее к пользовательской таблице? Я думаю, что-то вроде левого соединения пользовательской таблицы с предложением WHERE...IN?

Я никогда этого не делал и не видел, но, возможно, он существует.


person eromlige    schedule 23.09.2016    source источник
comment
Да, может быть, вам не нужно в   -  person Beginner    schedule 23.09.2016


Ответы (1)


Вы можете сделать это с производной таблицей и left join:

SELECT l.name
FROM (SELECT 'aname' as name UNION ALL
      SELECT 'bname' UNION ALL
      SELECT 'cname' UNION ALL
      . . .
     ) l LEFT JOIN
     user u
     ON u.username = l.name
WHERE u.username IS NULL
person Gordon Linoff    schedule 23.09.2016
comment
У нас есть победитель! - person eromlige; 23.09.2016
comment
Я столкнулся со смешанной ошибкой сопоставления. ‹br/› Я добавил BINARY приведение к сравнению. SELECT l.name FROM (SELECT 'aname' as name UNION ALL SELECT 'bname' UNION ALL SELECT 'cname' UNION ALL SELECT 'dname' ) l LEFT JOIN user u ON BINARY u.username = BINARY l.name WHERE u.username IS NULL - person eromlige; 23.09.2016