Python根据另一个列表中不存在的值筛选一个列表

Python根据另一个列表中不存在的值筛选一个列表,python,sql,python-2.7,ms-access,pypyodbc,Python,Sql,Python 2.7,Ms Access,Pypyodbc,尝试使用表B中未找到的2个值筛选表a上的查询结果。正确的语法和方法是什么 import pyodbc MDB = 'C:/db/db1.mdb'; DRV = '{Microsoft Access Driver (*.mdb)}'; PWD = 'pw' con = pyodbc.connect('DRIVER={};DBQ={};PWD={}'.format(DRV,MDB,PWD)) cur = con.cursor() SQLA = 'SELECT * FROM TABLE1;'

尝试使用表B中未找到的2个值筛选表a上的查询结果。正确的语法和方法是什么

 import pyodbc
 MDB = 'C:/db/db1.mdb'; DRV = '{Microsoft Access Driver (*.mdb)}'; PWD = 'pw'
 con = pyodbc.connect('DRIVER={};DBQ={};PWD={}'.format(DRV,MDB,PWD))
 cur = con.cursor()
 SQLA = 'SELECT * FROM TABLE1;' # your query goes here
 SQLB = 'SELECT * FROM TABLE2;' # your query goes here
 rows1 = cura.execute(SQLA).fetchall()
 rows2 = cura.execute(SQLB).fetchall()
 cur.close()
 con.close()
 for rit in rows1: 
     for git in rows2: 
        if (rit[1] and rit[2]) not in (git[1] and git[2]):
           print ((rit[1])  (rit[2]))

只需使用熟悉的左连接的纯SQL解决方案。。。为空/不存在/不在中。下面是等效查询,在MS Access中是兼容的,返回表A中的行,而不是基于col1和col2返回表B中的行

左连接…为空

选择a* 从表a 左连接表b 关于a.col1=b.col1和a.col2=b.col2 其中,b.col1为NULL,b.col2为NULL 不存在

选择a* 从表a 不存在的地方 从表b中选择1 其中a.col1=b.col1和a.col2=b.col2 不在

选择a* 从表a 其中a.col1不在表B中,请从表B中选择col1 a.col2不在表B中选择col1
只需使用熟悉的左连接的纯SQL解决方案。。。为空/不存在/不在中。下面是等效查询,在MS Access中是兼容的,返回表A中的行,而不是基于col1和col2返回表B中的行

左连接…为空

选择a* 从表a 左连接表b 关于a.col1=b.col1和a.col2=b.col2 其中,b.col1为NULL,b.col2为NULL 不存在

选择a* 从表a 不存在的地方 从表b中选择1 其中a.col1=b.col1和a.col2=b.col2 不在

选择a* 从表a 其中a.col1不在表B中,请从表B中选择col1 a.col2不在表B中选择col1
Parfait提供的SQL语句是首选解决方案,但如果您真的想使用双循环方法,则需要更像这样:

for rit in rows1:
    match_found = False
    for git in rows2: 
        if (rit[1] == git[1]) and (rit[2] == git[2]):
            match_found = True
            break
    if not match_found:
        print(rit)

Parfait提供的SQL语句是首选解决方案,但如果您真的想使用双循环方法,则需要更像这样:

for rit in rows1:
    match_found = False
    for git in rows2: 
        if (rit[1] == git[1]) and (rit[2] == git[2]):
            match_found = True
            break
    if not match_found:
        print(rit)


这个代码有效吗?如果是,您是否要求改进?如果没有,什么是坏的?不,当运行时,它会打印出表1中不应该出现的所有行。我认为您需要将ORDER BY子句添加到select语句中。此外,要使它工作,两个表中的前两列需要match@BKCapri-那么您想只列出表1中不存在于表2中的值对吗?如果是这样,那么这不是排序,而是一个过滤器。我在表1中的所有行之后,在表2中找不到表1中的值对。这段代码有效吗?如果是,您是否要求改进?如果没有,什么是坏的?不,当运行时,它会打印出表1中不应该出现的所有行。我认为您需要将ORDER BY子句添加到select语句中。此外,要使它工作,两个表中的前两列需要match@BKCapri-那么您想只列出表1中不存在于表2中的值对吗?如果是这样,那么这不是排序,而是一个过滤器。我在表1中的所有行之后,在表2中找不到表1中的值对。仍然返回了第1行中的所有行。@BKCapri-检查rit[1]、rit[2]、git[1]、git[2]返回的值;他们可能不是你想象的那样。这些行中的索引将以零为基础,因此rit中的第一个元素是rit[0]而不是rit[1]。哎呀,很抱歉输入错误,我的意思是,printrit仍然返回所有行TABLE1@BKCapri-您的代码中一定有其他错误。它对我来说很好。仍然返回了第1行中的所有行。@BKCapri-检查rit[1]、rit[2]、git[1]、git[2]返回的值;他们可能不是你想象的那样。这些行中的索引将以零为基础,因此rit中的第一个元素是rit[0]而不是rit[1]。哎呀,很抱歉输入错误,我的意思是,printrit仍然返回所有行TABLE1@BKCapri-您的代码中一定有其他错误。这对我来说很好。