【问题标题】:SQL - How do I create a join with different tables types?SQL - 如何创建具有不同表类型的连接?
【发布时间】:2014-04-16 02:31:23
【问题描述】:

例如我有三个表:

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 让我知道它是不是 Contractor、Staff、Student 等,然后 ID 是特定的 Student、Staff 等。

这不在关系表中,因为数据是 1:1。一人一车位。 由于此问题范围之外的原因,无法更改表格。

基本上,我有 4 张表格,它们都用于不同类型的数据,还有一张表格将停车位与分配给他们的特定人员联系起来。因此,为什么停车位表包含 dataType。

现在我要做的是一份报告,该报告将显示系统内所有有停车位的人的列表。因此,例如,我想要一份报告,其中列出所有状态为当前的人(当然编码为数字):

Jane, lot 51, Physics Department [department], Student [dataType], 555-5555
John, lot 52, Chemistry Department [department], Professor [dataType], 555-2212

所以我想问题是我如何从多个不同的表中对来自不同表的公共数据进行连接,同时提高查询的性能。

从技术上讲,我可以加入所有数据并带回所有数据,包括大部分为空值,但是当我想要一个所有人的列表并且只是公共的一个子集时,必须有比加入所有不同表更好的方法表(列的相同数据类型)。我也想这会有很糟糕的表现。

所以除了运行四次查询,对每个不同的数据类型一次然后组合它们,或者运行一个包含大量空数据的大规模连接,我还有其他选择吗?

【问题讨论】:

    标签: sql performance join


    【解决方案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
    

    无需在视图/联合中的任何一个中进行连接,因为查询引擎应该会为您处理这些。

    【讨论】:

    • 我喜欢 View 的想法,我只好选择另一个答案,因为您错过了每次选择所需的连接。
    • @StephaneGrenier:你不需要在视图内加入,你在使用视图时这样做。
    【解决方案2】:

    联合查询应该可以工作。这是一般的想法。你可以充实细节。

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-22
      • 1970-01-01
      • 1970-01-01
      • 2021-09-12
      • 1970-01-01
      • 2021-09-28
      • 1970-01-01
      • 2020-04-24
      相关资源
      最近更新 更多