从没有键的非规范化数据库查询许多表

时间:2019-07-10 23:04:12

标签: sql database teradata

所以对于一个麻烦的数据库,我有一个(对我来说)困难的问题,希望您能为我提供帮助。首先,让我设置场景。似乎数据库是从以前的版本复制到当前的数据库引擎中的。复制的内容似乎是表和列的名称,字段类型和长度以及内容。在整个数据库中,没有主键或外键。此外,旧数据库未标准化,当前数据库未标准化。为了使其更加有趣,我无法选择全部重建或更改任何内容。我唯一能做的就是运行选择查询。

在这种情况下,我有以下相关的表和列:

Table:
    Facilities
Columns:
    Asset_ID (bigint)
    Asset_Category (bigint)

Table:
    Gardens
Columns:
    Asset_ID (bigint)
    Asset_Category (bigint)

Table:
    Equipment
Columns:
    Asset_ID (bigint)
    Asset_Category (bigint)

Table:
    Structures
Columns:
    Asset_ID (bigint)
    Asset_Category (bigint)

每个都有相同类型的信息。例如,设施可能包含割草机,花园可能包含割草机。正如我所说,这是不规范的。数据以这种方式添加到不同的表中,而无需考虑有用性或标准化。每个ID字段都是一个bingint,并且和该字段一样有用。

此外,我还有以下表格:

Table:
    Depots
Columns:
    ID (bigint)
    Name (varchar)

Table:
    Area
Columns:
    ID (bigint)
    Site_ID (bigint)
    Name (varchar)

Table:
    Asset_Category
Columns:
    Type_ID (bigint)
    Category_ID (bigint)
    Category_Name (varchar)

Table:
    Depot_Assets
Columns:
    Depot_ID (bigint)
    Asset_ID (bigint)

Table:
    Facility_Assets
Columns:
    Asset_ID (bigint)
    Category (bigint)

现在,我猜测Asset_ID和Category_ID在表之间以某种方式神奇地匹配,存在一定程度的一致性,但是由于没有键且没有规范化,因此目前无法确定。

我被要求制作一份报告,显示每个地点每个类别的资产数量。我试图将前四个表的结果组合如下:

inner join
    (select "Asset_ID", "Category" from "Facilities" union all 
    select "Asset_ID", "Category" from "Gardens" union all 
    select "Asset_ID", "Category" from "Equipment" union all 
    select "Asset_ID", "Category" from "Structures") as temp
    on (temp."Category" = "Asset_Category"."Category_ID")

但是,除此之外,我对于如何获取分配给每个位置的每个类别(按Area.Name)的资产列表一无所知。

任何帮助和解释将不胜感激。

0 个答案:

没有答案