【问题标题】:ssrs lookup like an inner join but how how about a left join?ssrs 查找类似于内部联接,但左联接怎么样?
【发布时间】:2016-03-30 08:18:59
【问题描述】:

我对@9​​87654321@ 很熟悉,我认为(但可能是错误的)它等同于inner join

我想知道left joinright joinfull outer join 的等价物是什么。

谢谢。

【问题讨论】:

    标签: join reporting-services left-join ssrs-2012 outer-join


    【解决方案1】:

    对我来说,Lookup 看起来不像是内连接,而是相当于

    select 
        CustomerName = (select 
                            Customer.Name 
                        from 
                            Customers 
                        where 
                            Orders.CustomerId = Customer.Id),
        Orders.OrderDate
    from 
        Orders
    

    连接需要两个表,并根据某些 on-clause 匹配两个表上的行。连接类型规定了如何处理两边不匹配的行。

    Lookup 和上面的 SQL 等价物至少在概念上循环遍历一个表,并尝试在其他表中为每一行查找匹配的行。结果更像是左连接而不是内连接,因为不匹配的行将保留在结果中。但是,存在差异,因为 Lookup 期望在右侧找到单行,而连接会将结果集扩展到右侧的所有匹配行。因此,查找通常用于从关系的多侧到一侧进行查找,例如从上面的订单到客户。此外,连接表将参与聚合。

    有一个LookupSet function,它将查找多个值,但与连接不同,它不会扩展结果集,而是返回一个将“嵌套”在行中的值数组。

    因此,总而言之,我不认为查找等同于内部联接,并且 SSRS 中不存在任何其他类型的联接的等价物。

    话虽如此,您通常会在报表的数据源中执行连接,假设这是一个 SQL 数据源。

    【讨论】:

      【解决方案2】:

      R. Schreurs 的解释是正确的,lookup 函数的工作方式与左连接最相似,但如果无法编辑数据源,您可以使用一些变通方法。

      在大多数情况下,模拟右连接的最简单方法是反转数据集,即使用 DataSet2 作为表的数据集,并使用来自 DataSet1 的 Lookup 值。

      要模拟内连接,您可以使用lookup 来控制哪些数据行可见。使用 Row Visibility 属性中的表达式,您可以隐藏两个数据集中不存在 ID 的行:

      =IIF(IsNothing(Lookup(Fields!ID_1.Value, Fields!ID_2.Value, Fields!ID_2.Value, "DataSet2")), True, False)
      

      对于像 完全外部联接 一样工作的表,我不知道在不使用第三个数据集的情况下可以工作的解决方案。如果 DataSet0 具有来自 DataSet1 和 DataSet2 的所有可能的 ID,则可以将其用于来自其他数据集的 lookup 值。然后,您可以使用与上述类似的表达式来隐藏在 DataSet1 或 DataSet2 中找不到 ID 的行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-04-08
        • 2012-07-19
        • 1970-01-01
        • 2019-07-31
        • 2020-12-08
        • 2010-10-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多