【问题标题】:TVF UDF does not return the same data as SELECTTVF UDF 不返回与 SELECT 相同的数据
【发布时间】:2010-09-29 14:16:43
【问题描述】:

像这样调用 UDF:

SELECT
       product_name,
       SUM(quantity) AS SumQty,
       SUM(face_value) AS SumFaceValue,
       SUM(net_cost)AS SumNetCost,
       SUM(face_value - net_cost) AS SumScripRebate,
       organization_name
FROM getSalesSummary(@GLSCOrgId, @BeginDate, @EndDate) getSalesSummary
GROUP BY product_name, organization_name
ORDER BY product_name

产量:

   "Chili's      1    25.00   22.75  2.25   Sample Organization 1
    CVS/pharmacy 1  25.00   23.50  1.50   Sample Organization 1
    Macy's       1  100.00  90.00  10.00  Sample Organization 1"

使用 UDF 逻辑并使用 SELECT 测试结果:

SELECT 
       product_name,
       SUM(quantity) AS SumQty,
       SUM(face_value) AS SumFaceValue,
       SUM(net_cost) AS SumNetCost,
       SUM(face_value - net_cost) AS SumScripRebate,
       organization_name
FROM @ReturnTable
GROUP BY product_name, organization_name
ORDER BY product_name

产量:

   "Chili's       4   100.00  91.00   9.00   Sample Organization 1
    CVS/pharmacy  1   25.00   23.50   1.50   Sample Organization 1
    Macy's        1   100.00  90.00   10.00  Sample Organization 1"

@ReturnTable 是 UDF 返回的表,创建方式如下:

INSERT INTO @ReturnTable(product_name,
                         unit_price,
                         quantity,
                         face_value,
                         net_cost,
                         organization_name)
(select * from @TablePartial UNION select * from @TableClosed)

使用 SELECT 和变量的测试返回正确的数据,但调用 UDF 并没有获取其他 3 个 Chili 的记录。我对参数使用相同的数据。我对 UDF 很陌生,我不确定为什么它会返回与 SELECT 不同的数据。有什么建议和/或答案吗?

【问题讨论】:

  • 你可以为表格、数据和函数生成脚本并在这里发布它可以提供更多想法

标签: sql sql-server user-defined-functions


【解决方案1】:

您可能需要UNION ALL 而不是UNION

查看两个结果集,它加起来好像 4 Chilli 的行都是一样的。

Chili's      1    25.00   22.75  2.25   Sample Organization 1
Chili's      1    25.00   22.75  2.25   Sample Organization 1
Chili's      1    25.00   22.75  2.25   Sample Organization 1
Chili's      1    25.00   22.75  2.25   Sample Organization 1
-------------------------------------------------------------
Chili's       4   100.00  91.00   9.00   Sample Organization 1

使用UNION 将删除重复项,留下一行。

【讨论】:

  • UNION ALL 不会创建重复项吗?另外,这有什么关系?从表中选择所有并返回表应该给出相同的结果,无论它是如何创建的对吗?
  • UNION ALL 不会创建重复项。它只是不会删除重复项。不可能从这里推测为什么你会得到不同的结果。您需要为您的问题添加足够的细节,以便我们可以重现该问题。
  • 好的,我看看我还能发布什么,然后试试 UNION ALL
【解决方案2】:

我唯一能想到的就是把UNION改成UNION ALLUNION会消除重复

运行这些查询以查看差异

select 1 as a
union 
select 1
union 
select 1


select 1 as a
union  all
select 1
union all
select 1

【讨论】:

    猜你喜欢
    • 2019-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-28
    • 1970-01-01
    • 2014-12-08
    相关资源
    最近更新 更多