• union limit


    前言     
            今天小编在改bug的时候遇到一个既简单又让人头疼的问题,由于底层封装的执行sql语句的方法中没有合适我的,所以我只能在我的D层动手脚了……

    经验
    下面来说说我今天的情况:

            我们新建一个抽奖活动的时候需要绑定奖品,在绑定的时候肯定要去奖品池里查看一下我们填的这个奖品ID是否存在,如果存在就可以添加,不存在的话需要先去添加奖品,再进行绑定。由于我的奖品信息是可以动态添加多条的,所以我在进行查询的时候,传入的是一个奖品ID的数组,然后去依次的查询。之前使用的是一个for循环的语句,直接调的底层方法去查询,但是这个底层方法并不是我们想要的样子,是当这个查询语句没问题的时候就会返回true,只有发生异常的时候才会返回false,所以明显跟我们的需求不对应。所以我只能换了一种方法,动态拼接select语句……

    分享
            思路到了这就开始执行了,但是语句拼好了,那么当多个奖品的时候,我要怎么同时执行这些select语句呢?后来查到了可以使用union关键字来进行联合查询,下面我就开始给大家分享一下……

            1、union:联合的意思,即把两次或多次查询结果合并起来。

            2、   要求:两次查询的列数必须一致

            3、 可以来自多张表的数据:多次sql语句取出的列名可以不一致,此时以第一个sql语句的列名为准

            4、union会去掉重复的行,如果想保留重复的行,需要使用union all 

            5、如果子句中有order by,limit,需用括号()包起来。推荐放到所有子句之后,即对最终合并的结果来排序或筛选
                  例:(select * from a order by id) union (select * from b order id);
            6、在子句中,order by 需要配合limit使用才有意义。如果不配合limit使用,会被语法分析器优化分析时去除

            7、如果查询两个表中数据,两个表的字段是不一样的,

                 table1: (id,createDate,lastUpdateDate,desc,num,hashCode),
                 table2: (id,createDate,lastUpdateDate,desc)
                 如果现在使用: select * from table1 UNION ALL select * from table2 则是不会成功的, 数据库为报: 
                 Error  The used SELECT statements have a different number of columns

                 这是提示查询的两张表的字段不统一,如果table1比table2的字段内容多,可以使用空字符串来代替:

                  select id,createDate,lastUpdateDate,desc,num,hashCode from table1 UNION ALL select                                             id,createDate,lastUpdateDate,desc,'','' from table2 
                 如果里面有不想要的,千万要记住前面查询内容要和后面查询内容的字段个数要一样,前面你查询4个,后面也要相应的放4个,这样就不会提示参数数量不同的错误了。

            8、从效率上说,UNION ALL 要比UNION快很多,所以,如果可以确认合并的两个结果集中不包含重复的数据的话,那么就使用UNION ALL。

            

             下面小编放上自己项目中的代码,以便大家借鉴:


    public static bool Selectrewardinfo(string[] RewardIDstr1)
    {

    StringBuilder sbSql1 = new StringBuilder();
    for (int i = 0; i < RewardIDstr1.Length - 1; i++)
    {
    sbSql1.Append("SELECT RewardID FROM ta_reward_info WHERE RewardID = ");
    sbSql1.Append("'" + RewardIDstr1[i] + "'union");
    }
    sbSql1.Append(" SELECT RewardID FROM ta_reward_info WHERE RewardID = ");
    sbSql1.Append("'" + RewardIDstr1[RewardIDstr1.Length - 1] + "'");

    string sql = sbSql1.ToString();
    List<ta_activity_info> List = GetList1<ta_activity_info>(sql);
    bool flag;
    if (List.Count < RewardIDstr1.Length)
    {
    flag = false;
    }
    else
    {
    flag = true;
    }
    return flag;
    }

    总结
            经历了这么多,小编总结出来的只有一句话,那就是——方法总比问题多!没有我们解决不了的问题!加油~~
    ————————————————
    版权声明:本文为CSDN博主「大玉玉」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/xingyu0806/java/article/details/52150814

  • 相关阅读:
    Protocol Buffers教程
    Paxos、ZAB、RAFT协议
    kafka自定义序列化器
    Java cas原理
    常见的排序算法
    Java反射
    etcd单机集群
    通过tomcat shutdown port关闭tomcat
    Java ConcurrentHashMap初始化
    LaTeX技巧892: Ubuntu 安装新版本TeXLive并更新
  • 原文地址:https://www.cnblogs.com/deepalley/p/13307365.html
Copyright © 2020-2023  润新知