Python中的sqlite3交集
我想提取与我的两个数据集中存在的股票相对应的数据(在下面的代码中给出)。Python中的sqlite3交集
这是我的数据:
#(stock,price,recommendation)
my_data_1 = [('a',1,'BUY'),('b',2,'SELL'),('c',3,'HOLD'),('d',6,'BUY')]
#(stock,price,volume)
my_data_2 = [('a',1,5),('d',6,6),('e',2,7)]
这里是我的问题:
问题1:
我试图提取的价格,推荐和体积对应于资产 'A' 。我非常希望得到这样一个元组:
(u'a',1,u'BUY',5)
问题2:
如果我想获得交集的所有股票(不只是“一”的问题1),在此如果是库存“a”和库存“d”,那么我的期望输出变为:
(u'a',1,u'BUY',5)
(u'd',6,u'BUY',6)
我应该怎么做?
这是我尝试(问题1):
import sqlite3
my_data_1 = [('a',1,'BUY'),('b',2,'SELL'),('c',3,'HOLD'),('d',6,'BUY')]
my_data_2 = [('a',1,5),('d',6,6),('e',2,7)]
#I am using :memory: because I want to experiment
#with the database a lot
conn = sqlite3.connect(':memory:')
c = conn.cursor()
c.execute('''CREATE TABLE MY_TABLE_1
(stock TEXT, price REAL, recommendation TEXT)''')
c.execute('''CREATE TABLE MY_TABLE_2
(stock TEXT, price REAL, volume REAL)''')
for ele in my_data_1:
c.execute('''INSERT INTO MY_TABLE_1 VALUES(?,?,?)''',ele)
for ele in my_data_2:
c.execute('''INSERT INTO MY_TABLE_2 VALUES(?,?,?)''',ele)
conn.commit()
# The problem is with the following line:
c.execute('select* from my_table_1 where stock = ? INTERSECT select* from my_table_2 where stock = ?',('a','a') )
for entry in c:
print entry
我没有得到任何错误,也没有输出,这样的东西是清楚了。
我也试过这条线:
c.execute('select* from my_table_1 where stock = ? INTERSECT select volume from my_table_2 where stock = ?',('a','a')
,但它不工作,我得到这个错误:
c.execute('select* from my_table_1 where stock = ? INTERSECT select volume from my_table_2 where stock = ?',('a','a') )
sqlite3.OperationalError: SELECTs to the left and right of INTERSECT do not have the same number of result columns
我明白为什么我会有不同数量造成的列,但不要”很明显,为什么会触发一个错误。
我该怎么做?
非常感谢您提前
看起来这两个问题实际上是同一个问题。
为什么你的查询不起作用:让我们重新格式化查询。
SELECT * FROM my_table_1 WHERE stock=? INTERSECT SELECT volume FROM my_table_2 WHERE stock=?
有在交叉路口查询,
SELECT * FROM my_table_1 WHERE stock=?
SELECT volume FROM my_table_2 WHERE stock=?
的 “相交” 的含义是 “给我,是两个查询行” 。如果查询具有不同数量的列,则这没有任何意义,因为任何行都不可能出现在两个查询中。
请注意,SELECT volume FROM my_table_2
不是一个非常有用的查询,因为它不会告诉您该卷属于哪个库存。查询会给你类似{100, 15, 93, 42}
。
你实际上要做的:你想加入。
SELECT my_table_1.stock, my_table_2.price, recommendation, volume FROM my_table_1 INNER JOIN my_table_2 ON my_table_1.stock=my_table_2.stock WHERE stock=?
认为join是“将一个表中的行粘合到另一个表中的行上,从而将数据从一个行中的两个表中提取出来。
这是奇怪的,价格出现在两个表中;当您用连接编写查询时,您必须决定是要my_table_1.price
还是my_table_2.price
,或者您是否想加入my_table_1.price=my_table_2.price
。你可能想考虑重新设计你的模式,这样不会发生,它可能会让你的生活更轻松。
您对如何关联不同表格有所误解。
为了做到这一点的最简单的方法是用合适的条件加入其中,导致的结果自动地包括来自连接表中的数据。在下面的例子中,我选择了所有的列,但是你当然可以通过在FROM子句中命名它们来选择你想要的列。您还可以仅使用WHERE子句中的(a)更多条件选择所需的那些行。当你执行你的代码,请尝试以下操作:
>>> c.execute("select * from my_table_1 t1 JOIN my_table_2 t2 ON t1.stock=t2.stock")
<sqlite3.Cursor object at 0x1004608f0>
这告诉SQLite的,从表1中采取行和表行加入他们2次会议ON子句(即的条件下,它们必须有相同的STOCK属性值)。由于您选择了这样长的表名,并且因为我是一个糟糕的打字员,所以我在FROM子句中使用了表格声明以允许我在查询的其余部分使用缩短的名称。
>>> c.fetchall()
然后给你结果
[(u'a', 1.0, u'BUY', u'a', 1.0, 5.0), (u'd', 6.0, u'BUY', u'd', 6.0, 6.0)]
这似乎回答这两个1)和2)。对于STOCK的特定值,只需向查询字符串中添加
WHERE t1.STOCK = 'a' -- or other required value, naturally
。你可以看到通过查询光标的描述属性返回的列的名称:
>>> [d[0] for d in c.description]
['stock', 'price', 'recommendation', 'stock', 'price', 'volume']
相交操作用于从两个独立的SELECT查询采取输出和返回仅发生在这两个元素。我认为这不会有帮助。您遇到错误的原因是因为查询必须是“UNION兼容的”,也就是说它们在相交查询中需要相同的数量和类型的列。
非常感谢您的回答;它完全符合我的要求。另外,谢谢你的解释,我需要那:)。 – Akavall 2012-03-28 17:52:57