Python中sqlite3的交集

Aka*_*all 2 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)]
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)

我理解为什么我会有不同数量的结果列,但不完全明白为什么会触发错误.

我该怎么做?

先感谢您

Die*_*Epp 5

看起来这两个问题确实是同一个问题.

为什么查询不起作用:让我们重新格式化查询.

SELECT * FROM my_table_1 WHERE stock=?
INTERSECT
SELECT volume FROM my_table_2 WHERE stock=? 

交叉点有两个查询,

  1. SELECT * FROM my_table_1 WHERE stock=?
  2. 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.pricemy_table_2.price或是否要加入my_table_1.price=my_table_2.price.您可能需要考虑重新设计架构,这样就不会发生,它可能会让您的生活更轻松.