美文网首页码农的世界程序员技术栈
mysql中查询表中不存在的数据 将常量作为临时表进行关联查询

mysql中查询表中不存在的数据 将常量作为临时表进行关联查询

作者: 刘振宁的博客 | 来源:发表于2019-05-13 10:17 被阅读3次

    巨大的建筑,总是由一木一石叠起来的,我们何妨做做这一木一石呢?我时常做些零碎事,就是为此。
    这是对的,但是我没有说过这句话! —— 鲁迅

    先看一个例子

    select name from user u where u.name in ('zhangsan', 'lisi');
    

    有一个用户表user,现在user表中有lisi,wangwu,但是没有zhangsan,上面语句查出来的结果,肯定是lisi。
    那么我现在的需求是把zhangsan查出来,也就是,我有一个常量列表,我要查询这些常量有哪些在表中不存在,是新数据。

    将常量作为临时表进行关联查询.

    这里有 zhangsan,lisi等一些常量,现在的目的是,假装这些数据是从表中查出来的。如下:

    select 'zhangsan' as name 
    union select 'lisi'
    

    在oracle中,要用到临时表dual,而mysql中不需要,可以不from任何表.
    上面的sql,就会查出来 zhangsan,lisi这两个值,并且属性名为name.

    联合查询

    select * from (select 'zhangsan' as name 
    union select 'lisi') t
    where not exists(select 1 from user u where t.name = u.name)
    

    修改第一个查询

    因为我们的常量是一个list,在编程语言中,比如mybaties中,是可以用foreach等循环结构拼接出来的。
    但是通过观察,发现,第一个select和非第一个select是不一样的,其他的有union,而第一个没有union,这样拼接的时候,就要对第一个做特殊处理。
    我们可以让第一个什么也不查出来,即空,这样就行了。如下:

    select * from
        (select name from user where id = -1
        union select 'zhangsan'
        union  select 'penglx') t
    where not exists(select 1 from user u where t.name = u.name);
    

    相关文章

      网友评论

        本文标题:mysql中查询表中不存在的数据 将常量作为临时表进行关联查询

        本文链接:https://www.haomeiwen.com/subject/gtzkaqtx.html