我有一個數據庫(MySQL 5.1),它使用交叉引用表(local_ref,在下面的示例中)獲取值的數字ID。我已經引入了另一個交叉引用表(下面的foreign_ref)來將這些數字ID引用到另一個數據庫中的索引。通常情況下,這不是一個複雜的連接,但是,我有多個使用交叉引用表(下面的val1和val2)中的鍵的列。基於兩個交叉引用表連接多個表
如:
mysql> select * from foo;
+-----+------+------+
| id | val1 | val2 |
+-----+------+------+
| 100 | A | B |
| 200 | A | D |
| 300 | B | C |
+-----+------+------+
mysql> select * from local_ref;
+----+-------+
| id | value |
+----+-------+
| 1 | A |
| 2 | B |
| 3 | C |
| 4 | D |
| 5 | E |
+----+-------+
mysql> select * from foreign_ref;
+----------+------------+
| local_id | foreign_id |
+----------+------------+
| 1 | 10 |
| 2 | 20 |
| 3 | 30 |
| 4 | 40 |
+----------+------------+
我需要的是以下幾點:
+-----+---------+---------+
| id | val1_id | val2_id |
+-----+---------+---------+
| 100 | 10 | 20 |
| 200 | 10 | 40 |
| 300 | 20 | 30 |
+-----+---------+---------+
知道,原來的表不歸,因爲它應該是,我已經取得的成果,下面的兩個方式:
將兩個交叉參考表重複兩次:
SELECT
FOO.id, F_R1.foreign_id, F_R2.foreign_id
FROM FOO
JOIN
Local_Ref as L_R1 ON (FOO.val1 = L_R1.value)
JOIN
Local_Ref as L_R2 ON (FOO.val2 = L_R2.value)
JOIN
Foreign_Ref as F_R1 ON (L_R1.id = F_R1.local_id)
JOIN
Foreign_Ref as F_R2 ON (L_R2.id = F_R2.local_id)
加入交叉引用表兩次並混淆每個連接。
SELECT
FOO.id, joint1.foreign_id, joint2.foreign_id
FROM
FOO
JOIN
(
SELECT * FROM Local_Ref JOIN Foreign_Ref ON Local_Ref.id = Foreign_Ref.local_id
) as joint1
ON FOO.val1 = joint1.value
JOIN
(
SELECT * FROM Local_Ref JOIN Foreign_Ref ON Local_Ref.id = Foreign_Ref.local_id
) as joint2
ON FOO.val2 = joint2.value
我覺得這兩種方法相當低效,可以改進。除了重建數據庫之外,還有沒有更有效的解決方案?
你的方法很好。 –