一尘不染

如何将SQL子查询转换为联接

sql

我有两个具有1:n关系的表:“内容”和“版本内容数据”(例如,文章实体以及该文章创建的所有版本)。我想创建一个显示每个“内容”的最高版本的视图。

当前,我使用此查询(带有一个简单的子查询):

SELECT 
   t1.id, 
   t1.title, 
   t1.contenttext,
   t1.fk_idothertable
   t1.version
FROM mytable as t1
WHERE (version = (SELECT MAX(version) AS topversion
                  FROM mytable
                  WHERE (fk_idothertable = t1.fk_idothertable)))

子查询实际上是对提取相同项目的最高版本的同一表的查询。请注意,版本化的项目将具有相同的fk_idothertable。

在SQL Server中,我尝试创建此查询的 索引视图 ,但由于 索引视图中
不允许子查询,因此似乎无法执行。所以…这是我的问题…您能想到一种使用JOIN将查询转换为某种查询的方法吗?

似乎索引视图不能包含:

  • subqueries
  • common table expressions
  • derived tables
  • HAVING clauses

我很绝望。任何其他想法,欢迎:-)

非常感谢!


阅读 239

收藏
2021-03-17

共1个答案

一尘不染

如果表已经在生产中,这可能无济于事,但建模的正确方法是使version = 0为永久版本,并始终增加OLDER材质的版本。因此,当您插入新版本时,您会说:

UPDATE thetable SET version = version + 1 WHERE id = :id
INSERT INTO thetable (id, version, title, ...) VALUES (:id, 0, :title, ...)

然后这个查询就是

SELECT id, title, ... FROM thetable WHERE version = 0

没有子查询,没有MAX聚合。您总是知道当前版本是什么。您无需选择max(version)即可插入新记录。

2021-03-17