2015-12-18 68 views
2

我有這4個表。查詢帶有2個外鍵的表

Mail 
---- 
id 
date 

Source (can have many source) 
------ 
id 
mailID : FK Mail.id 
personID : FK Person.id 

Destination (can have many destination) 
----------- 
id 
mailID : FK Mail.id 
personID : FK Person.id 

Person 
------ 
id 
name 

我想創建一個查詢,返回所有源和目標ID的每個郵件。

到目前爲止,我已經提出了這個查詢,但它效率相當低,因爲它查詢兩次相同的表。

Select * FROM (
    Select m.*, personID, 'Source' AS TableName 
    FROM Mail m join Source s 
    ON m.id = s.mailid 
UNION ALL 
    Select m.*, personID, 'Destination' AS TableName 
    FROM Mail m join Destination d 
    ON m.id = d.mailid 


) t ORDER BY id, TableName; 

results: 

id | date | personID | TableName 
-------------------------------- 
1 | 1-1-11| 3  | Source 
1 | 1-1-11| 4  | Source 
1 | 1-1-11| 5  | Source 
1 | 1-1-11| 10  | Destination 
1 | 1-1-11| 11  | Destination 
2 | 2-2-11| 1  | Source 
2 | 2-2-11| 2  | Destination 

回答

2

試試這個:

SELECT m.id, m.name, a.personID, a.TableName 
FROM Mail m 
INNER JOIN (SELECT s.mailid, s.personID, 'Source' AS TableName 
      FROM Source s 
      UNION ALL 
      SELECT d.mailid, d.personID, 'Destination' AS TableName 
      FROM Destination d 
      ) AS a ON m.id = a.mailid 
ORDER BY m.id, a.TableName; 
+0

完全忘了我可以只移動郵件查詢出來! – Tim