【问题标题】:组解决方案中的最大价值,也满足索引视图的要求
【发布时间】:2021-12-19 16:00:05
【问题描述】:

在 Azure SQL 数据库中,我有一个 EAV 样式表 AttributeValues,它存储多个属性值,如下所示:

Id Organization_Id Attribute_Id Value
1 1 1 Old Org 1 Description
2 1 1 New Org 1 Description
3 2 1 Old Org 2 Description
4 2 1 New Org 2 Description
5 1 2 Old Org 1 Title
6 1 2 New Org 1 Title
7 2 2 Old Org 2 Title
8 2 2 New Org 2 Title

这些值需要转置为特定于组织的行,如下所示,其中包括每种类型的最新属性值(即顶部值,按 AttributeValues.Id DESC 排序):

Organization_Id Description Title
1 New Org 1 Description New Org 1 Title
2 New Org 2 Description New Org 2 Title

另外需要注意的是,工作查询需要遵守 索引视图 的所有限制,这意味着没有 PIVOT、没有 CTE 或派生表、没有窗口函数、没有子查询、没有外部连接等,因为描述和标题字段需要应用全文索引才能与 CONTAINS() 一起使用进行搜索。这个可以吗?

【问题讨论】:

  • 您可以分离关注点并为历史版本使用历史表或临时表。
  • 否 - 对于索引视图(例如自联接、OVER 子句、派生表、子查询、MIN ,最大,应用,枢轴)

标签: sql-server pivot full-text-search greatest-n-per-group indexed-view


【解决方案1】:

似乎您只需要“每组前 1 个”,然后是 PIVOT/条件聚合:

WITH RNs AS(
    SELECT Organization_Id,
           Attribute_Id,
           [Value],
           ROW_NUMBER() OVER (PARTITION BY Organization_Id,Attribute_Id ORDER BY Id DESC) AS RN
    FROM (VALUES(1,1,1,'Old Org 1 Description'),
                (2,1,1,'New Org 1 Description'),
                (3,2,1,'Old Org 2 Description'),
                (4,2,1,'New Org 2 Description'),
                (5,1,2,'Old Org 1 Title'),
                (6,1,2,'New Org 1 Title'),
                (7,2,2,'Old Org 2 Title'),
                (8,2,2,'New Org 2 Title'))V(Id,Organization_Id,Attribute_Id,Value))
SELECT Organization_Id,
       MAX(CASE Attribute_Id WHEN 1 THEN [Value] END) AS Description,
       MAX(CASE Attribute_Id WHEN 2 THEN [Value] END) AS Title
FROM RNs
WHERE RN = 1
GROUP BY Organization_Id;

但是,如前所述,您不能为此视图编制索引。如果您需要索引视图,您可能需要先规范化您的设计,然后再查看历史/临时表。

【讨论】:

  • CTE 在这种情况下不是一个选项 - 此查询不能在索引视图中使用。
  • 那么答案是“你无法做到这一点”@coryseaman。也许您应该切换到规范化设计。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-02
  • 1970-01-01
  • 2011-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多