我正在尝试提取与我的两个数据集中存在的库存相对应的数据(在下面的代码中给出).
这是我的数据:
#(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)]
Run Code Online (Sandbox Code Playgroud)
这是我的问题:
问题1:
我正在尝试提取与资产'a'对应的价格,建议和数量.理想情况下,我想得到这样的元组:
(u'a',1,u'BUY',5)
Run Code Online (Sandbox Code Playgroud)
问题2:
如果我想获得所有股票的交叉点(不仅仅是问题1中的'a'),在这种情况下它是股票'a'和股票'd',那么我想要的输出变成:
(u'a',1,u'BUY',5)
(u'd',6,u'BUY',6)
Run Code Online (Sandbox Code Playgroud)
我该怎么做?
这是我的尝试(问题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
Run Code Online (Sandbox Code Playgroud)
我没有错误,但也没有输出,所以有些东西显然是关闭的.
我也尝试过这一行:
c.execute( 'select* from my_table_1 where stock = ? INTERSECT select volume from my_table_2 where stock = ?',('a','a')
Run Code Online (Sandbox Code Playgroud)
但它不起作用,我收到此错误:
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
Run Code Online (Sandbox Code Playgroud)
我理解为什么我会有不同数量的结果列,但不完全明白为什么会触发错误.
我该怎么做?
先感谢您
看起来这两个问题确实是同一个问题.
为什么查询不起作用:让我们重新格式化查询.
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=?"intersect"的含义是"给我两个查询中的行".如果查询具有不同的列数,则没有任何意义,因为任何行都不可能出现在两个查询中.
请注意,这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.您可能需要考虑重新设计架构,这样就不会发生,它可能会让您的生活更轻松.
| 归档时间: |
|
| 查看次数: |
1382 次 |
| 最近记录: |