例如,我有三个表:
Students:
ID, name, address, department, yearEnrolled, etc.
Professors:
ID, name, address, department, etc.
Contractors:
ID, name, address, department, company, etc.
Staff:
ID, name, department, jobClassification, etc.
最后:
Parking Spots:
ID, name, location, dataType, dataID, etc.
dataType让我知道它是否是承包商,员工,学生等,然后ID是特定的学生,员工等。
这不在关系表中,因为数据是1:1。一个人到一个停车位。 由于此问题范围之外的原因,无法更改表格。
基本上我有4个表,分别用于不同类型的数据,还有一个表,用于将停车位与分配给他们的特定人员联系起来。因此,停车位表包含dataType。
现在我要做的是一份报告,它会显示系统中所有有停车位的人员的列表。例如,我想要一份报告,其中列出了当前状态(编码为课程编号)的所有人:
Jane, lot 51, Physics Department [department], Student [dataType], 555-5555
John, lot 52, Chemistry Department [department], Professor [dataType], 555-2212
所以我想问题是如何从多个不同的表中连接来自不同表的公共数据,同时使查询具有高性能。
从技术上讲,我可以加入所有内容并恢复所有数据,包括一个大多数为空的值,但是当我想要一个包含每个人的列表而只是公共子集时,必须有一个比加入所有不同表更好的方法。表(列的数据类型相同)。我还想象这会有糟糕的表现。
除了运行查询四次,每次运行一次不同的dataType,然后将它们组合在一起,或运行大量的空数据连接,我还有其他选择吗?
答案 0 :(得分:1)
联合查询应该有效。这是一般的想法。你可以充实细节。
select blah, blah
from ParkingSpots join Students on something
where dataType = 'Student'
union all
select blah, blah
from ParkingSpots join Professors on something
where dataType = 'Professor'
etc
答案 1 :(得分:1)
您使用UNION
执行此操作。具体来说,您有4个查询,每个查询返回公共数据。您可以将其作为视图编写,以便于查询。
GO
Create view Combined as
Select ID, name, address, department, 'students' datatype from Students
Union Select ID, name, address, department, 'professors' datatype from Professors
Union Select ID, name, address, department, 'contractors' datatype from Contractors
Union Select ID, name, address, department, 'Staff' datatype from Staff
Go
编辑回应评论。
你会像这样使用它......
Select Select ID, name, address, department
From Combined c
Inner join ParkingSpots p
On c.datatype = p.datatype
你也可以像这样使用cte ......
;with combined as (
Select ID, name, address, department, 'students' datatype from Students
Union Select ID, name, address, department, 'professors' datatype from Professors
Union Select ID, name, address, department, 'contractors' datatype from Contractors
Union Select ID, name, address, department, 'Staff' datatype from Staff
)
Select Select ID, name, address, department
From Combined c
Inner join ParkingSpots p
On c.datatype = p.datatype
无需在视图/联合内部进行连接,因为查询引擎应该为您处理..