基于查询加入两个不同的表格
问题描述:
我们拥有包含50多个数据字段和多个国家/地区特定产品代码的大型(2M +行)产品数据表。我希望能够从ProductData有效地加入基于不同代码字段的不同查找表。我们目前使用单独但非常类似的SP来实现逻辑,并且在更改时导致版本问题。 SP本身通常是200-500行实现复杂逻辑的行,95%的逻辑是通用的,但大多数连接语句都是特定于国家/地区的。基于查询加入两个不同的表格
在伪SQL的简化版本看起来像这样
ProductTable Schema
Id, Data1, Data2, .... , ProductCodeUK, ProductCodeUSA, ProductJapan
SP1_USA
select Id, Data, Data, LookupUSA.Price As Price from ProductTable
join LookupUSA on ProductTable.ProductCodeUSA = LookupUSA.Code
SP2_UK
select Id, Data, Data, LookupUK.Price As Price from ProductTable
join LookupUK on ProductTable.CodeVersion2 = LookupUK.ProductCodeUK
注意代码值经常反复在不同国家之间,所以我们不能轻易合并的查找表一起。
答
你的问题是你的模式设计的很糟糕。您需要标准化的:
ProductCodeUK, ProductCodeUSA, ProductCodeJapan, ProductCodeGermany, ...
您应将此数据移动到新的表有三列,其中之一是一个外键返回到原来的表:
Product CountryCode ProductCode
和你的查找表应该是这样的:
CountryCode ProductCode Price ....
有了这个新设计的加入都是一样的。要选择不同的国家,您现在只需要修改WHERE子句中的参数。
+1:这是组织这个的正确方法。 – 2010-11-13 22:26:24
当我们尝试这种方法时,我们获得了很大的性能提升,因此按照现在的模式进行。由于查找表有不同的列,因此我们可以将这些问题标准化,但在某些情况下,我们会加入4个表格 – MrTelly 2010-11-14 23:20:40
@MrTelly:我怀疑您看到的“性能问题”是要么是由于写入的查询效率低下,要么是因为缺少索引。检查EXPLAIN并调整查询和/或索引,直到性能得到改进。至于查找表中的差异 - 这是一个棘手的问题要解决。如果不了解更多关于这些表格的具体情况,我无法真正对此发表评论。除了改变模式之外,我唯一能想到的其他事情就是使用一个视图来封装重复的逻辑 - 但它似乎无法帮助您查看您在示例中提供的查询。 – 2010-11-14 23:34:25