zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    select、poll和epoll
    Linux 常用命令之文件和目录
    SmartPlant Review 帮助文档机翻做培训手册
    SmartPlant Foundation 基础教程 3.4 菜单栏
    SmartPlant Foundation 基础教程 3.3 标题栏
    SmartPlant Foundation 基础教程 3.2 界面布局
    SmartPlant Foundation 基础教程 3.1 DTC登陆界面
    SmartPlant Foundation 基础教程 1.4 SPF架构
    SmartPlant Foundation 基础教程 1.3 SPF其他功能
    SmartPlant Foundation 基础教程 1.2 SPF集成设计功能
  • 原文地址:https://www.cnblogs.com/deepalley/p/13307365.html
Copyright © 2011-2022 走看看