2012-07-27 64 views
1

我在兩個表中有兩種不同的實體,只有一些我想要加入的公共列,並按照其中一個公共列進行排序。在結果表中,每行應表示來自一個表的行或來自另一個表的行。例如,對於表所示:如何連接表以獲取每行源表的一行?

CREATE TABLE apple (
    apple_id INT NOT NULL AUTO_INCREMENT, 
    acquired DATETIME NOT NULL, 
    is_fresh TINYINT, 
    PRIMARY KEY (apple_id) 
); 

'1', '2012-07-27 19:06:58', '1' 
'2', '2012-07-28 18:05:43', '0' 

CREATE TABLE orange (
    orange_id INT NOT NULL AUTO_INCREMENT, 
    acquired DATETIME NOT NULL, 
    is_yummy TINYINT, 
    PRIMARY KEY (orange_id) 
); 

'1', '2012-06-12 10:03:31', '0' 
'2', '2012-08-30 22:00:02', '1' 

我查詢的想法加入他們會是這樣的:

SELECT 
    IF(orange_id IS NULL, 'apple', 'orange') AS type, 
    IF(orange_id IS NULL, apple.acquired, orange.acquired) AS acquired, 
    is_fresh, 
    is_yummy 
FROM apple CROSS JOIN orange ON apple_id IS NULL OR orange_id IS NULL 
ORDER BY acquired ASC 

'orange', '2012-06-12 10:03:31', NULL, '0' 
'apple', '2012-07-27 19:06:58', '1', NULL 
'apple', '2012-07-28 18:05:43', '0', NULL 
'orange', '2012-08-30 22:00:02', NULL, '1' 

我看到了一些問題與此查詢:

  1. 如果我明白CROSS JOIN的工作原理,查詢速度會很慢,因爲它會經歷每種可能的蘋果橙色組合,不是嗎?有更快的方法嗎?

  2. IF(...)功能看起來很醜。他們真的有必要嗎?

回答

1

我不確定這是否是針對您的問題的解決方案。但是你可以使用聯合進行類似的輸出。十字軍加入比較聯盟會更快。

+0

謝謝,這恰恰就是我一直試圖用'JOIN's發明的那種輪子:) – Septagram 2012-07-27 11:47:10