2014-10-10 60 views
1

我有4個表獲取數據,SQLite的查詢從多個表

ModTable 的file_id,mod_flag

TrackTable artist_id album_id 的file_id 標題

AlbumTable album_id,專輯

ArtistTable artist_id,藝術家

我需要得到artist_id,album_id,專輯,藝術家,FID,標題從這些表中所有的file_id其中mod_flag = 1

到目前爲止我所做的是(僞代碼)

1. SELECT file_id, artist_id, album_id, title FROM TrackTable WHERE file_id IN (SELECT file_id FROM ModTable WHERE mod_flag=1);  

在極端情況下,這將返回大約30000 f ile_ids。因此,對於所有這些file_ids,

2. for(int count=0; count < noOfRecords/*30000*/; count++)   
    SELECT artist FROM ArtistTable WHERE artist_id==%llu  
    SELECT album FROM AlbumTable WHERE album_id==%llu  

上面的查詢對我的作品,但我想知道這個優化的方式是否實現這一點。我應該避免在循環內查詢嗎?

回答

1

通常你會像下面那樣加入表格。這應該會導致更好的性能,因爲連接可以通過查詢引擎進行優化。

SELECT 
    t.file_id, 
    t.artist_id, 
    t.album_id, 
    t.title, 
    a.album, 
    ar.artist 
FROM 
    TrackTable t 
    join AlbumTable a on t.album_id = a.album_id 
    join ArtistTable ar on t.artist_id = ar.artist_id 
WHERE t.file_id IN (SELECT file_id FROM ModTable WHERE mod_flag=1); 
+0

非常感謝您的查詢。我做了這個查詢和我提到的(在問題中)的性能比較。您使用JOIN的建議比在循環內部使用查詢快了大約10秒(在實際的TI J6硬件中進行了測試)。 – wrongElk 2014-10-16 11:00:27