代码之家  ›  专栏  ›  技术社区  ›  littlegreen

QlikView中的非标准联接?

  •  1
  • littlegreen  · 技术社区  · 16 年前

    最近我们在办公室测试了QlikView。第一印象是好的:它有一个吸引人的界面和执行非常快。我们希望将其用作客户的数据库前端。我们还试图确定它是否可以接管我们的关系数据库结构的一部分。然而,我们怀疑它的数据库功能是否足够先进,不只是一个有吸引力的前端。

    具体来说,我们遇到了以下问题。在QlikView中,只需在表之间设置相等的字段名,就可以完成等效的普通联接(equijoin)操作—然后将链接这些字段。但是,我们的一个传统的SQL联接操作使用“between”查询来确定日期是否在某个范围内,并联接有关该范围的数据。

    是否可以在QlikView中指定表之间的这种“非等联接”关系?或者这是所谓的“关联数据库”结构的固有限制吗?

    2 回复  |  直到 13 年前
        1
  •  1
  •   Marcus    16 年前

    当然可以-我想你想要的是intervalmatch函数。

        2
  •  4
  •   miq    13 年前

    马库斯的回答是正确的。这样做的方法是使用IntervalMatch。您可以按原样拥有这两个表,并使用intervalmatch在这两个表之间添加“between”关系。运行加载脚本后,不能添加关系。

    首先,您必须加载具有日期范围的表(省略了SQL查询)。让我们说:

    Ranges:
    LOAD
        rangeID,
        validfrom, // date
        validto,   // date
        commonkey, // common key for the two tables
        price;     // the data that's needed as a result of the linking
    

    其次,加载另一个带有日期的表

    Data:
    LOAD
        column1,
        column2,
        date,
        commonkey;
    

    接下来,您必须使用IntervalMatch。这是一种方法:

    Left Join (Data)
    IntervalMatch(date, commonkey)
    LOAD
        validfrom,
        validto,
        commonkey
    Resident Ranges;
    

    现在您有了两个表之间的链接。您可以通过添加以下内容来删除生成的合成密钥:

    Left Join (Data)
    LOAD
        validfrom,
        validto,
        commonkey,
        rangeID
    Resident Ranges;
    
    DROP Fields validfrom, validto FROM Data;
    

    现在,通过使用 rangeID 关键。如果表没有一些共同的键,比如类别ID或其他东西(即只需要匹配日期),您可以忽略 commonkey 在上面的例子中。我只是想将它包括在示例中,因为我自己需要它,希望它能帮助有类似问题的人。

    您可以在标有“IntervalMatch(Extended)”的QlikView帮助中找到此项。这个 Qlikview cookbook (fillRowsIntervalMatch.qvw)也帮助我解决了这个问题。

    推荐文章