【问题标题】:how to convert rows to column based type filter without using sub-query如何在不使用子查询的情况下将行转换为基于列的类型过滤器
【发布时间】:2020-04-20 08:18:03
【问题描述】:

我有大量数据可以在类型列上进行过滤。我可以使用带有自连接的子查询获取行数据并转换为列,但是由于数据量大,使用子查询会花费很多时间。我的表结构是这样的:

表 A

Id | ItemName | Type
 1 | Item1    | A  
 2 | Item2    | A  
 3 | Item3    | B  
 4 | Item4    | B  

表 B

Id | ItemDescTag | Ext
 1 | ItemTag     |  A  
 4 | ItemTag     |  B  

查询

Select ItemName,PurchaseOrdr.Quantity, PurchaseOrdr.PORate, PurchaseOrdr.CostAmount 
from TableA its
left join ( 
select it.Id, it.Quantity,(it.CostAmount/it.Quantity)as PORate, it.CostAmount from TableA it 
inner join Table B m on it.Type = convert(int ,m.Ext)
)as PurchaseOrdr on PurchaseOrdr.Id = its.Id  

我需要另一种方法来摆脱这个 SUB-QUERY,因为我必须创建 10 个类似类型的 SUB-QUERY 才能获取所需的数据,并且由于数百万条记录,它会减慢速度......

【问题讨论】:

标签: mysql sql-server tsql


【解决方案1】:

根据其他 10 个子查询的相似程度,您可以在 CTE 中提前查询所需的列,例如

;WITH PurchaseOrdr_CTE AS(
  SELECT
    it.Id,
    it.Quantity,
    it.CostAmount
  FROM TableA it
  JOIN TableB m
    ON it.Type = convert(int ,m.Ext)
)
SELECT
  ItemName,
  PurchaseOrdr.Quantity
, (PurchaseOrdr.CostAmount/PurchaseOrdr.Quantity) AS PORate, 
  PurchaseOrdr.CostAmount  
FROM TableA its
LEFT JOIN PurchaseOrdr_CTE PurchaseOrdr
  ON its.Id = PurchaseOrdr.Id                 

在这个特定的示例中,我根本不需要两次引用 TableA。但是您使用的实际查询可能有其他列,帖子中未包含逻辑。

it.Type = convert(int ,m.Ext) 转换会有一些开销。如果可以使用一致的数据类型,那显然更好。

如果您正在处理数百万条记录并且这将是一个重要的查询,那么一个好的覆盖索引将会产生很大的影响。

【讨论】:

  • 是的,我还有其他列包含类似的(ItemName、PurchaseOrdr.Quantity、(PurchaseOrdr.CostAmount/PurchaseOrdr.Quantity)AS PORate、PurchaseOrdr.CostAmount)选择
  • “期初余额”、“净购买”等 3 列中发生了什么变化。只有类型?我的意思是,您的实际子查询是否类似于 ON it.Type = convert(int ,m.Ext) WHERE it.Type = '2' -- 期初余额等
  • 我多次需要这个突出显示的 col...pasteboard.co/INUHDvy.png 根据类型输入输出...
  • 您在上面的查询中列出的“ItemName”是什么? PhysicalVoucher 什么的?如果您需要将查询结果旋转为列。实际上,您的选择是使用子查询或 CTE 执行您已经在执行的操作,尽管 CTE 在此键中没有太大帮助,在每个集合中按 Extra1 进行过滤。或者 PIVOT 可能是最好的选择。特别是如果您已经定义了一个小的“Extra1”类型列表。不需要进入动态枢轴或类似的东西。
  • Extra1 是有限的,但是表 A 中的类型 col 有超过 300 万条记录...
猜你喜欢
  • 2010-10-21
  • 2012-03-20
  • 1970-01-01
  • 2019-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-28
  • 2020-03-01
相关资源
最近更新 更多