创建具有多个外键引用单个字段的视图

Create a view with multiple foreign key referencing a single field

如何使用 table 创建一个视图,它有多个引用相同 table 的外键和一个字段。我有产品 table 和参考文献 table 我在产品 table 中有大约 5 个外键引用参考文献 table 中的 RefCodeKey 字段。如何创建显示产品参考代码加入产品和参考代码的视图

我有一个产品table如下

   PK  PTK   PC      PN    RCKey PSKey PCKey PCAKey
    1   1   500000  Prod A  5    12     14  98
    2   1   500001  Prod B  5    12     14  98
    3   1   500002  Prod C  5    11     13  145
    4   4   500002  Prod C  10   11     13  76
    5   3   500002  Prod C  10   11     13  95
    6   1   500005  Prod D  5    12     14  137

我有参考码Table如下

RefCodeKey  RefCodeType        Code        Label       Status
1       ParentTypeKey         assembly      assembly   Active
2       ParentTypeKey           WHL          WHL       Active
3       ParentTypeKey           TIRE        TIRE       Active
4       ParentTypeKey           TIRE        TIRE       Active
5       RegionCodeKey           1           COMP 1     Active
6       RegionCodeKey           2           COMP 2     Active
7       RegionCodeKey           3           COMP 3     Active
8       RegionCodeKey           4           COMP 4     Active
9       RegionCodeKey           9           COMP 5     Active
10      RegionCodeKey           0           COMP 6     Active
11      ProductStatusKey        CLOSED      CLOSED     Active
12      ProductStatusKey        ACTIVE     ACTIVE   Active
13      ProductClassificationKey DropShip   DropShipActive
14      ProductClassificationKey INFO NA    INFO NA Active

如何创建一个视图来显示如下所示的结果?

PC        PN    RCKey PSKey   PCKey
500000  Prod A  COMP 1  ACTIVE  INFO NA 
500001  Prod B  COMP 1  ACTIVE  INFO NA 
500002  Prod C  COMP 1  CLOSED  DropShip    
500002  Prod C  COMP 6  CLOSED  DropShip    
500002  Prod C  COMP 6  CLOSED  DropShip    
500005  Prod D  COMP 1  ACTIVE  INFO NA

这是数据库架构师采用“one true lookup table”模型的常见报告模式。我不会纠结于该设计的优点。在评论这些事情时,像 Celko 和 Phil Factor 这样的人比我博学得多。我要说的是,在过去 15 年中报告了 60 多个企业数据库,这种设计无处不在。无论对错,您可能会一遍又一遍地看到它。

目前没有足够的信息来明确回答您的问题。下面的答案对我认为最有可能缺失的信息进行了假设。

  1. 我假设您的产品 table 名为 PRODUCT
  2. 我假设你的全能查找 table 是调用 REFS
  3. 我假设 REFS 中的 RefCodeKey 对其具有唯一约束,或者它是主键
  4. 我假设 REFS table 相对较小(比如 < 100,000 行)。我稍后会回到这一点。
  5. 我假设 PRODUCT table 中的外键可以为空。这会影响我们是 INNER JOIN 还是 LEFT JOIN。

    SELECT prod.PC
           ,prod.PN
           ,reg_code.label  as RCKey
           ,prod_stat.label as PSKey
           ,prod_clas.label as PCKey
    FROM   PRODUCT             prod
           LEFT JOIN REFS  reg_code ON prod.RCKey = reg_code.RefCodeKey
           LEFT JOIN REFS prod_stat ON prod.PSKey = prod_stat.RefCodeKey
           LEFT JOIN REFS prod_clas ON prod.PCKey = prod_clas.RefCodeKey
    ;
    

诀窍在于您可以根据需要多次参考 REFS table。你只需要给它一个不同的别名,每次都将它加入到相关的 FK 中。例如 reg_code 是一个别名。为您的别名提供有意义的名称,以保持您的代码可读性。

注:那些RCKey/PSKey/PCKey名字真的不是什么好名字。他们会回来咬你的。它们不代表密钥。它们代表了对所讨论事物的描述。如果是区号,就叫它region_code

我假设 REFS table 相对较小的原因是,如果它真的很大(我已经看到一个在数百个代码集中有 600 万个查找值)并且被索引以将 RefCodeType 纳入考虑到,您可以通过为每个 LEFT JOIN 添加 RefCodeType 过滤器来获得更好的性能。例如:

       LEFT JOIN REFS prod_clas ON prod.PCKey = prod_clas.RefCodeKey
                                   AND prod_clas.RefCodeType = 'ProductClassificationKey'