用 2 个外键查询 table
Query a table with 2 foreign keys
我有这 4 tables。
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
我正在尝试创建一个查询,returns 每封邮件都包含所有源 ID 和目标 ID。
到目前为止,我已经提出了这个查询,但它的效率相当低,因为它查询相同的 table 两次。
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
试试这个:
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;
我有这 4 tables。
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
我正在尝试创建一个查询,returns 每封邮件都包含所有源 ID 和目标 ID。
到目前为止,我已经提出了这个查询,但它的效率相当低,因为它查询相同的 table 两次。
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
试试这个:
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;