【问题标题】:Join 2 tables based on column name present in a table row根据表行中存在的列名连接 2 个表
【发布时间】:2018-12-29 14:31:46
【问题描述】:

我有一个名为 Target 的表,其中有 5 列:

ProductLevel
ProductName
CustomerLevel
CustomerName
Target

在另一个名为 Products 的表中,我有 3 列:

ProductId
ProductCategory
ProductBrand

在名为 Customer 的第三张表中,我有 3 列:

CustomerID
CustomerName
SubCustomerName

有没有办法进行动态连接,根据我在第一个表中的值选择我将在 JOIN 中使用的列?

示例:如果在第一个表中我在 ProductLevel 中有类别,我将使用 ProductCategory 字段加入表产品。如果我有 Brand,我将使用 ProductBrand 加入... Customer 表也是如此。

PS:我正在寻找一种动态创建它的方法,我可以在不更改代码的情况下向该表添加新列,然后我可以在 Product Table 和 Segment 中将 ProductSegment 列作为值目标表中的 ProductLevel。

【问题讨论】:

  • 如果不修改 SQL 代码,您将无法做到这一点。您可以在应用程序中生成代码(比如使用 Java 或类似的东西),但那是动态 SQL。

标签: sql join hive


【解决方案1】:

是的,像这样:

SELECT * FROM
  Target t
  INNER JOIN
  Product p
  ON
    (t.ProductLevel = 'Category' AND t.??? = p.ProductCategory)
    OR
    (t.ProductLevel = 'Brand' AND t.??? = p.ProductBrand)

您没有说 Target 中的哪一列包含您的产品类别/品牌,因此 ???在上面的查询中。代替 ???有一些理智的东西

PS;您不能按照您在 PS 中的要求进行操作,甚至上面的这种结构也表明您的数据模型已损坏。即使没有 t.ProductLevel = 'Segment' 的行,您现在至少可以为其添加代码

不要指望它能够很好地执行或扩展。您可以通过将其作为一组 UNION 查询而不是 OR 来提高性能,但您可能会遇到不使用索引的问题,从而削弱性能

【讨论】:

    猜你喜欢
    • 2011-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-14
    • 2015-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多