根据另一个表中的匹配值从一个表中选择数据

问题描述:

我试图根据另一个表中的数据从一个表中选择数据。我的代码如下:Update SQLite table based on data in another table根据另一个表中的匹配值从一个表中选择数据

但我无法让它产生我期待的结果。我的发言如下:

c.execute("SELECT item1, item2, item3 FROM TableA WHERE xyz IS NULL AND item1 = (SELECT item1 FROM TableB) AND item2 = (SELECT item2 FROM TableB) AND item3 = (SELECT item3 FROM TableB)" 

我试图选择表A,所有匹配的结果,其中项目1,项目2,&项目3 TableB中的比赛与在表A +,其中表A的XYZ值为NULL。

*TableA* 

item1 | item2 | item3  | xyz 

banana | apple | pear  | NULL 
carrot | potato | sausage | 1 
cat | dog | bird  | NULL 
fish | squid | tortoise | 4 


*TableB* 

item1 | item2 | item3 

banana | apple | pear 
cat | dog | bird 
fish | squid | tortoise 
foo | bar | deadbeef 

所以,我想选择:

banana, apple, pear 
cat, dog, bird 

但是我的语句只返回从tableB的第一场比赛:

banana, apple, pear;并且不继续搜索来自表B的其余项目。

为什么会发生这种情况并且能够解决问题?

我现在没有SQLite在手,所以请原谅错别字......但是inner join不是一个很好的解决方案吗?

c.execute("""SELECT item1, item2, item3 
       FROM TableA JOIN TableB USING (item1,item2,item3) 
       WHERE xyz IS NULL") 

此连接将匹配相同“三联” 行(item1,item2,item3)


如果你只有在共同的三列item1..3你的两个表,你甚至可能要到一个自然连接

c.execute("""SELECT item1, item2, item3 
       FROM TableA NATURAL JOIN TableB 
       WHERE xyz IS NULL") 

这是一个内部联接隐式地对列在两个表中都有相同的名称。 虽然我不是一个很大的粉丝,因为它可能会成为一个定时炸弹,准备爆炸的一天,有人无意中添加一些列到您的表...

+0

辉煌,谢谢你(也为链接和建议)。两个例子都有效,但我想我会听从你的建议并坚持第一! – Soap 2014-09-01 16:15:14