I have two tables with a 1:n relationship: "content" and "versioned-content-data" (for example, an article entity and all the versions created of that article). I would like to create a view that displays the top version of each "content".
I use this query (with a simple subquery):
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)))
The subquery is to the same table that extracts the highest version of a specific item. The versioned items will have the same fk_idothertable.
In SQL Server I tried to create an indexed view of this query but subqueries are not allowed in indexed views.
What is a way to convert this query to one with JOINs?
It seems like indexed views cannot contain:
- subqueries
- common table expressions
- derived tables
- HAVING clauses
This probably won’t help if table is already in production but the right way to model this is to make version = 0 the permanent version and always increment the version of OLDER material. So when you insert a new version you would say:
Then this query would just be
No subqueries, no MAX aggregation. You always know what the current version is. You never have to select max(version) in order to insert the new record.