2013-06-06 14 views
1

我很努力地加入mySQL或SQL Server中的多個表,並保持性能的快速。 我有這個表:如何在MySQL或SQL Server的多表上進行高效加入?

表歌曲

songID|songName 
--------------- 
01|diamond 
02|goodbye 

表singersong

songID|singerID 
--------------- 
01|15 
02|22 

表歌手

singerID|singerName|Sex 
------------------------ 
15| Rihanna | F 
22| Air Supply | M 

而且我想我的結果是這樣的:

songID|songName|singerName|Sex 
------------------------------ 
01|diamond|Rihanna|F 
02|goodbye|Air Supply| M 

我的查詢是這樣的

SELECT s.songID, s.songName, sr.singerName, sr.Sex 
FROM songs s, singersong ss, singer sr 
WHERE 
ss.songID = s.songID AND 
ss.singerID = sr.singerID 
ORDER BY s.songID 

而且它執行非常非常慢..反正是有讓這個查詢簡單或更有效?

非常感謝您的幫助.. LL

+0

假設有一位歌手沒有相應的歌曲。你是否也希望他被包含在結果中? –

+0

@JSWorld不,我不希望那樣..它將首先基於歌曲,然後查找歌手的細節..所以如果有歌曲,但沒有歌手,它會是好的,但不是其他方式。謝謝.. –

回答

0

指定的條件加入上。根據優化器的興趣,您當前的查詢可能會在所有表格之間生成笛卡爾積,然後過濾結果。還要確保你有索引和FKs設置正確。

SELECT s.songID, s.songName, sr.singerName, sr.Sex 
FROM songs s 
LEFT JOIN singersong ss ON s.songID = ss.songID 
LEFT JOIN singer sr ON ss.singerID = sr.singerID 
ORDER BY s.songID 

更換LEFT JOININNER JOIN如果你不想當有一個相關的表中沒有匹配項的空值返回做。

+0

應該是INNER JOIN,而不是LEFT JOIN,等同於他的原始版本。 – Barmar

0

你的語法不是現代風格,但它應該可以正常工作。爲了提高性能,請確保在所有用於連接的列上都有索引:songIDsingerID

0

僅僅有索引是不夠的,您需要跨列連接表的行列方向的多列索引,也就是說,如果您從Song開始並前往歌手,索引將爲: INDEX songSinger(songID, singerID)

如果你是從歌手到宋查詢,該指數將是: INDEX SingerSong(singerID,songID)

,如果你只有一列索引,則MySQL將使用索引來獲得表singersong中的一組結果,加載結果,然後掃描下一步加入結果列表。

但是,如果您有一個跨兩列的索引,MySQL甚至不會加載連接表,它只是使用索引。