Oh, sorry.
In my original question I mentioned:
I have a Test Chat App where I am trying to fetch chat list using this solution
I pasted the link to sample code from GRDB documentation.
This means that my example code is exactly the same as the code from the GRDB documentation, but with just only one exception: I also get the owner of the last message.
Next, I simply extend the example code from docs with:
struct MessageInfo: Decodable, FetchableRecord {
var message: Message
var owner: User // <- there
}
struct ChatInfo: Decodable, FetchableRecord {
var chat: Chat
var latestMessage: MessageInfo? // <- there
}
let latestMessageRequest = Message
.including(required: Message.user.forKey("owner")) // <- there
.annotated(with: max(Column("date")))
.group(Column("chatID"))
I didn't provide just that part of my sample below. But there's obviously nothing unusual here.
struct User: Codable, FetchableRecord, PersistableRecord {
var id: Int64
}
extension Message {
static let user = belongsTo(User.self)
}
Then when I waited for any answers I could found my own solution. (Then I updated my original question)
//`latestMessageCTE` is from sample from docs
let messageOwnerAssociation = latestMessageCTE.association(to: User.self) { message, user in
user[Column("id")] == message[Column("userId")]
}
let request = Chat
.with(latestMessageCTE)
.including(optional: latestMessage
.including(required: messageOwnerAssociation.forKey("owner"))) // <- there
.asRequest(of: ChatInfo.self)
I thought I didn't have to show the full code of the sample, because it almost just repeats the sample from the documentation. 
So I promise that in the future I will show the full code anyway.
(But anyway I think you have some magical powers
)