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

原文地址:https://www.cnblogs.com/deepalley/p/13307365.html