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

时间:2014-09-01 15:49:18

标签: python sqlite

我正在尝试根据另一个表中的数据从一个表中选择数据。我的代码遵循以下内容提供的答案: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)"

我正在尝试从TableA中选择所有匹配的结果,其中item1,item2和& tableB中的第3项与TableA中的那些匹配,其中TableA的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中的其余项目。

为什么会这样,是否可以解决?

1 个答案:

答案 0 :(得分:1)

我现在手头没有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")

这是在两个表中具有相同名称​​列的列上隐式进行的内部联接。 我不是一个忠实的粉丝,因为它可能会成为一个定时炸弹,准备爆炸当天有人无意中在你的桌子上添加了一些列......