Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中sqlite3中的交集_Python_Sqlite - Fatal编程技术网

Python中sqlite3中的交集

Python中sqlite3中的交集,python,sqlite,Python,Sqlite,我试图提取与我的两个数据集中存在的股票对应的数据(在下面的代码中给出) 这是我的数据: #(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: import sqlite3 my_dat

我试图提取与我的两个数据集中存在的股票对应的数据(在下面的代码中给出)

这是我的数据:

#(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:

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
我试图提取与资产“a”对应的价格、建议和数量。理想情况下,我希望得到这样的元组:

(u'a',1,u'BUY',5)
问题2:

如果我想得到所有股票的交集(不只是问题1中的“a”),在这种情况下是股票“a”和股票“d”,那么我想要的输出变成:

(u'a',1,u'BUY',5)
(u'd',6,u'BUY',6)
我该怎么做

以下是我的尝试(问题1):

我没有得到错误,但也没有输出,所以有些东西显然是错的

我也试过这句话:

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=?
>>> c.fetchall()
将join视为“将一个表中的行粘到另一个表中的行上,在一行中提供两个表中的数据。”


奇怪的是,价格出现在两个表格中;当您使用联接编写查询时,您必须决定是要
my_table_1.price
还是
my_table_2.price
,还是要在
my_table_1.price=my_table_2.price
上联接。你可能会考虑重新设计你的模式,这样就不会发生,它可能会让你的生活更轻松。

< P>你正遭受着如何处理不同表的误解。

为了做到这一点,最简单的方法是使用合适的条件连接它们,结果会自动包含来自两个连接表的数据。在下面的示例中,我选择了所有列,但是您当然可以通过在FROM子句中命名它们来只选择您想要的列。您还可以在WHERE子句中使用进一步的条件仅选择需要的行。执行代码后,请尝试以下操作:

>>> c.execute("select * from my_table_1 t1 JOIN my_table_2 t2 ON t1.stock=t2.stock")
<sqlite3.Cursor object at 0x1004608f0>
然后给你结果

[(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)。只需为特定价值的股票添加

WHERE t1.STOCK = 'a'  -- or other required value, naturally
添加到查询字符串。您可以查看通过查询游标的description属性返回的列的名称:

>>> [d[0] for d in c.description]
['stock', 'price', 'recommendation', 'stock', 'price', 'volume']

INTERSECT操作用于从两个单独的SELECT查询获取输出,并仅返回在这两个查询中出现的元素。我认为这在这里没有什么帮助。出现错误的原因是,查询必须是“UNION兼容”的,也就是说,它们在相交查询中需要相同数量和类型的列。

非常感谢您的回答;这正是我想要的。另外,谢谢你的解释,我需要:)。
>>> [d[0] for d in c.description]
['stock', 'price', 'recommendation', 'stock', 'price', 'volume']