有的时候需要在不同的数据库实例之间做集合操作,这就无法直接使用SQL语句的join,left join了。相同类型的数据库之间虽然也有类似于DBLINK和FEDERATED之类的东西,但一来这些东西不同的数据库之间是不能通用的,还有就是这些都要在数据库服务端上操作的,即使是dba要走这么一个申请流程也是非常麻烦的。所以就想自己写几个常用的:

inner_join:内连接操作,t1 join t2 on t1.col=t2.col,返回连接字段相等的行,方式包括下面的外连接用的都是最简单的nested loop join。

left_join:左连接操作,t1 left join t2 on t1.col=t2.col,返回左边所有的行以及右表中连接字段相等的行,注意的是右边没有的要以NULL填充。

right_join:右连接操作,t1 right join t2 on t1.col=t2.col,和左连接一样,就是左右的位置换了一下。

union_all:两个集合合并。

union:和union_all一样,就是要除去重复的。

代码如下:

#!/usr/local/bin/python
# -*- coding: utf8 -*- '''
Created on 2016年5月23日 @author: PaoloLiu
''' class sql_merge(object):
'''
classdocs
''' def __init__(self):
'''
Constructor
''' def inner_join(self, left_table, right_table, left_join_col, right_join_col): pass new_result = [] for left_row in left_table:
for right_row in right_table: if left_row[left_join_col] == right_row[right_join_col]:
new_row = left_row + right_row
new_result.append(new_row) return new_result def left_join(self, left_table, right_table, left_join_col, right_join_col): pass new_result = [] addnull = None if len(right_table) > 0:
for i in range (1, len(right_table[0])):
addnull = (addnull, None) for left_row in left_table: n = 0 for right_row in right_table: if left_row[left_join_col] == right_row[right_join_col]:
new_row = left_row + right_row
new_result.append(new_row)
else:
n = n + 1 if n == len(right_table):
new_result.append(left_row + addnull)
else:
new_result = left_table return new_result def right_join(self, left_table, right_table, left_join_col, right_join_col):
return self.left_join(right_table, left_table, right_join_col, left_join_col) def union_all(self, left_table, right_table):
return left_table + right_table def union(self, left_table, right_table):
result = self.union_all(left_table, right_table) new_result = [] for row in result:
if row not in new_result:
new_result.append(row) return new_result def order_asc(self, result, col):
result.sort(key=lambda x:x[col])
return result def order_desc(self, result, col):
result.sort(key=lambda x:x[col], reverse=True)
return result def test():
pass left_result = [(1, "aaa"), (2, "bbb"), (3, "ccc"), (6, None), (1, "")]
right_result = [(1, ""), (2, ""), (4, ""), (5, "abc")]
print "left_result=" + str(left_result)
print "right_result=" + str(right_result)
print "==========================================================" sqlmerge = sql_merge() print "inner_join=" + str(sqlmerge.inner_join(left_result, right_result, 0, 0))
print "left_join=" + str(sqlmerge.left_join(left_result, right_result, 0, 0))
print "right_join=" + str(sqlmerge.right_join(left_result, right_result, 0, 0))
print "union_all=" + str(sqlmerge.union_all(left_result, right_result))
print "union=" + str(sqlmerge.union(left_result, right_result))
print "order_asc=" + str(sqlmerge.order_asc(left_result, 0))
print "order_desc=" + str(sqlmerge.order_desc(left_result, 0)) if __name__ == "__main__":
test()

测试记录运行结果:

left_result=[(1, 'aaa'), (2, 'bbb'), (3, 'ccc'), (6, None), (1, '')]
right_result=[(1, ''), (2, ''), (4, ''), (5, 'abc')]
==========================================================
inner_join=[(1, 'aaa', 1, ''), (2, 'bbb', 2, ''), (1, '', 1, '')]
left_join=[(1, 'aaa', 1, ''), (2, 'bbb', 2, ''), (3, 'ccc', None, None), (6, None, None, None), (1, '', 1, '')]
right_join=[(1, '', 1, 'aaa'), (1, '', 1, ''), (2, '', 2, 'bbb'), (4, '', None, None), (5, 'abc', None, None)]
union_all=[(1, 'aaa'), (2, 'bbb'), (3, 'ccc'), (6, None), (1, ''), (1, ''), (2, ''), (4, ''), (5, 'abc')]
union=[(1, 'aaa'), (2, 'bbb'), (3, 'ccc'), (6, None), (1, ''), (2, ''), (4, ''), (5, 'abc')]
order_asc=[(1, 'aaa'), (1, ''), (2, 'bbb'), (3, 'ccc'), (6, None)]
order_desc=[(6, None), (3, 'ccc'), (2, 'bbb'), (1, 'aaa'), (1, '')]

最后貼一张我认为最能说明SQL JOIN关系的图。还有要注意的是not in子查询是可以用左边从上往下第二个left join所代替的。

用python(2.7)自定义实现SQL的集合操作的更多相关文章

  1. sql的集合操作

    原文转自:http://blog.csdn.net/qsyzb/article/details/12560917 SELECT语句的查询结果是元组的集合,所以多个SELECT语句的结果可进行集合操作. ...

  2. Python 列表、元组、字典及集合操作详解

    一.列表 列表是Python中最基本的数据结构,是最常用的Python数据类型,列表的数据项不需要具有相同的类型 列表是一种有序的集合,可以随时添加和删除其中的元素 列表的索引从0开始 1.创建列表 ...

  3. python笔记04-----字典、元组、集合操作

    1.字典 是一种key-value的数据类型,使用就像字典 无序的因为无下标 创建一个字典: info = {     'stu1':'qq',     'stu2':'ww',     'stu3' ...

  4. Python学习—数据库篇之SQL补充

    一.SQL注入问题 在使用pymysql进行信息查询时,推荐使用传参的方式,禁止使用字符串拼接方式,因为字符串拼接往往会带来sql注入的问题 # -*- coding:utf-8 -*- # auth ...

  5. Python开发【第一篇】Python基础之自定义模块和内置模块

    为什么要有模块,将代码归类.模块,用一砣代码实现了某个功能的代码集合. Python中叫模块,其他语言叫类库. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代 ...

  6. Python预编译语句防止SQL注入

    这个月太忙,最近不太太平,我的愿望是世界和平! ================================== 今天也在找python的预编译,早上写的sql是拼接来构成的.于是找了2篇文章,还 ...

  7. python+selenium之自定义封装一个简单的Log类

    python+selenium之自定义封装一个简单的Log类 一. 问题分析: 我们需要封装一个简单的日志类,主要有以下内容: 1. 生成的日志文件格式是 年月日时分秒.log 2. 生成的xxx.l ...

  8. python之django直接执行sql语句

    python之django直接执行sql语句 sql = 'select * from stu' info = 模型类.objects.raw(sql)

  9. python之MySQL学习——防止SQL注入

    python之MySQL学习——防止SQL注入 学习了:https://www.cnblogs.com/xiaomingzaixian/p/7126840.html https://www.cnblo ...

随机推荐

  1. lvs负载均衡net模式

    环境配置,一台双网卡的ens33,ens37,ens37的网关是ens33的IP,指定一下nginx ens33,192.168.30.22,ens37,172.16.1.1nginx  192.16 ...

  2. 【转载】jmeter将上一个接口返回值作为下一个接口的请求参数

    第一:通过JSON Extractor 插件来提取JSON响应结果 原文地址:http://blog.csdn.net/dreamtl/article/details/68957122 接口响应结果, ...

  3. Git创建本地分支并关联远程分支(一)

    默认,git项目只有一个分支,就是master,我们当然可以在本地创建多个分支,并推送到远程git管理平台上,或者将远程git管理平台上的其他分支拉取到自己电脑上. 一.查看本地已有的分支 进入到项目 ...

  4. 无需编写代码,API业务流程测试,零代码实现

    引言 除了测试单个接口,我们常常需要对多个有数据或者逻辑关联的接口进行业务流程测试,例如获取验证码-注册-登录.传统测试业务流程需要编写一系列测试代码,现在通过eoLinker全UI界面,无需编写任何 ...

  5. C++引用、类型转换、类和对象(day03)

    十 C++的引用(Reference) 引用型函数参数 )将引用用于函数的参数,可以修改实参变量的值,同时也能减小函数调用的开销. )引用参数有可能意外修饰实参的值,如果不希望修改实参变量本身,可以将 ...

  6. IMSI MCC MNC概念

    TelephonyManager telManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); /** 获取 ...

  7. Spring MVC学习总结(2)——Spring MVC常用注解说明

        使用Spring MVC的注解及其用法和其它相关知识来实现控制器功能. 02     之前在使用Struts2实现MVC的注解时,是借助struts2-convention这个插件,如今我们使 ...

  8. 使用idea创建maven项目时 需要注意的问题

    截几张图来说明吧 上面的红色框如果不选中  将来创建的工程中没有webapp目录以及下面的子目录 选中之后  然后一直“下一步”  直到工程创建 但是我第一次按照正确的方式操作时  工程中并没有src ...

  9. SSH框架下单元测试的实现

    SSH框架下单元测试的实现 实现的功能 实现了部门的增删改查 对Action进行了单元测试 对Service 进行了单元测试,通过mock的方式实现. 实现的步骤 一.对Action层的单元测试实现 ...

  10. Effective JavaScript Item 31 优先使用Object.getPrototypeOf,而不是__proto__

    本系列作为Effective JavaScript的读书笔记. 在ES5中引入了Object.getPrototypeOf作为获取对象原型对象的标准API.可是在非常多运行环境中.也提供了一个特殊的_ ...