我正在尝试根据另一个表中的数据从一个表中选择数据。我的代码遵循以下内容提供的答案: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中的其余项目。
为什么会这样,是否可以解决?
答案 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")
这是在两个表中具有相同名称列的列上隐式进行的内部联接。 我不是一个忠实的粉丝,因为它可能会成为一个定时炸弹,准备爆炸当天有人无意中在你的桌子上添加了一些列......