2014-09-01 176 views
0

我試圖根據另一個表中的數據從一個表中選擇數據。我的代碼如下: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的其餘項目。

爲什麼會發生這種情況並且能夠解決問題?

回答

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") 

這是一個內部聯接隱式地對列在兩個表中都有相同的名稱。 雖然我不是一個很大的粉絲,因爲它可能會成爲一個定時炸彈,準備爆炸的一天,有人無意中添加一些列到您的表...

+0

輝煌,謝謝你(也爲鏈接和建議)。兩個例子都有效,但我想我會聽從你的建議並堅持第一! – Soap 2014-09-01 16:15:14

相關問題