【问题标题】:Data Mart - how to handle one to many relation?数据集市 - 如何处理一对多关系?
【发布时间】:2014-10-06 18:11:36
【问题描述】:

我有以下不知道如何处理的情况: 有一个表 Inovice_Item、Service 和 ServiceLang。 Invoice_item 表有 FK_Service 键(一对一)。服务表有 FK_Service_Lang 键。 ServiceLang 表具有 FK_Service 键,因此它使其成为多对多关系。

换句话说,Invoice_Item 可以有多个 ServiceLang 记录,这意味着当我进行连接查询时,invoice_item 记录会重复。处理这种情况有哪些选择?

我想在多维数据集中有 ServiceLang 维度,但我不确定如何处理由 join 引起的重复。

编辑

我做了一个例子:

查询如下:

-- One lang for service A, two langs for service B
select * from ServiceLang

-- Two records: A and B
select * from Service

-- Total amount is 20
select * from InvoiceItem

-- Query to populate Fact table
-- Total amount is 30
select * 
from InvoiceItem II
inner join Service S on II.FK_Service = S.PK_Service
inner join ServiceLang SL on S.PK_Service = SL.FK_Service

所以,如果有两个 Service_Lang 记录与一项服务相关,那么有一个重复的行意味着总服务量将是 30 但应该是 20。那么,我的问题是如何处理这些情况?

【问题讨论】:

    标签: sql join ssis duplicates data-warehouse


    【解决方案1】:

    从你的描述看错了。每个 Invoice_Item 有一个且只有一个 Service,每个 Service 有一个且只有一个 Service_Lang。但是每个 Service_Lang 有很多 Service 记录,每个 Service 有很多 Invoice_Item 记录

    关系是

        Invoice (n) <- (1) Service (n) <- (1) Service_Item
    

    因此 JOIN 将是

        Select Invoice_Item.*, Service_Lang.WhateverColumnYouWant
          From Invoice_Item
               Inner Join Service On Service.Key = Invoice_Item.FK_Service_Key
               Inner Join Service_Lang On Service_Lang.Key = Service.FK_Service_Lang_Key
    

    编辑:所以服务表没有上面有 FK_Service_Lang 键,在这种情况下,您只能选择与服务关联的语言的可能值之一。您可以根据您的首选语言选择最小值、最大值或一些派生词,一些示例......

    Select InvoiceItem.*,
           Case When Exists (Select 1 From ServiceLang
                              Where ServiceLang.FK_Service = InvoiceItem.FK_Service
                                And ServiceLang.Name = 'English')
                Then 'English'
                Else (Select Max(Name) From ServiceLang
                       Where ServiceLang.FK_Service = InvoiceItem.FK_Service)
                End As ServiceLanguage,
           (Select Max(Name) From ServiceLang
             Where ServiceLang.FK_Service = InvoiceItem.FK_Service) As MaxLanguage,
           (Select Min(Name) From ServiceLang
             Where ServiceLang.FK_Service = InvoiceItem.FK_Service) As MinLanguage
      From InvoiceItem
    

    我不知道您的 ServiceLang 表有多大,但好的做法是确保 FK_Service 列上有一个键

    【讨论】:

    • 我已经编辑了我的问题,添加了示例,也许现在会更清楚
    • 我刚刚发现这篇文章给了我一些指导,一旦找到最终解决方案就会更新:stackoverflow.com/questions/10385513/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-28
    • 1970-01-01
    • 2019-04-21
    • 1970-01-01
    相关资源
    最近更新 更多