【问题标题】:SQL LEFT JOIN where clause with IN comparisonSQL LEFT JOIN where 子句与 IN 比较
【发布时间】:2017-01-31 18:41:54
【问题描述】:

可能无意中发现了一个很好的 SQL 测试题。

  • 我有一张表,假设有大约 100 个用户名。
  • 我有一组 10 个可能的用户名 { aname, bname, cname, dname, ... }

如果我这样做:

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

我得到一个选择的用户名列表,减去表中未找到的用户名,grand.

我真正想要的是表中未找到的列表。

如果WHERE...IN 子句列表是一个表,我只需将LEFT JOIN 放到用户表中并过滤NULLs

有没有办法在不制作临时表并将其加入用户表的情况下做到这一点?我猜,是用户表与WHERE...IN 子句的左连接?

我从未做过或见过它,但也许它存在。

【问题讨论】:

  • 是的,也许你不需要

标签: mysql sql join left-join where-in


【解决方案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

【讨论】:

  • 我们赢了!
  • 我确实遇到了“混合排序规则”错误。
    我在比较中添加了一个 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
猜你喜欢
  • 2018-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-28
  • 2014-05-25
  • 1970-01-01
相关资源
最近更新 更多