繁体   English   中英

如何在不使用子查询的情况下将行转换为基于列的类型过滤器

[英]how to convert rows to column based type filter without using sub-query

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

表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 才能获得所需的数据,而且由于有数百万条记录,它会减慢速度......

根据其他 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) 转换会有一些开销。 如果可以使用一致的数据类型,那显然更好。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM