创建具有多个外键引用单个字段的视图
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 多个企业数据库,这种设计无处不在。无论对错,您可能会一遍又一遍地看到它。
目前没有足够的信息来明确回答您的问题。下面的答案对我认为最有可能缺失的信息进行了假设。
- 我假设您的产品 table 名为 PRODUCT
- 我假设你的全能查找 table 是调用 REFS
- 我假设 REFS 中的 RefCodeKey 对其具有唯一约束,或者它是主键
- 我假设 REFS table 相对较小(比如 < 100,000 行)。我稍后会回到这一点。
我假设 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'
如何使用 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 多个企业数据库,这种设计无处不在。无论对错,您可能会一遍又一遍地看到它。
目前没有足够的信息来明确回答您的问题。下面的答案对我认为最有可能缺失的信息进行了假设。
- 我假设您的产品 table 名为 PRODUCT
- 我假设你的全能查找 table 是调用 REFS
- 我假设 REFS 中的 RefCodeKey 对其具有唯一约束,或者它是主键
- 我假设 REFS table 相对较小(比如 < 100,000 行)。我稍后会回到这一点。
我假设 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'