Golang、postgresql、go-pg、UNION ALL 和 WITH

Fre*_*ors 5 sql postgresql union go go-pg

I\xe2\x80\x99m 使用 Golang、PostgreSQL 和 go-pg ( https://github.com/go-pg/pg )。

\n\n

我需要这个查询:

\n\n
WITH cte AS (\n    SELECT\n        "player"."id",\n        "player"."created_at",\n        "player"."note"\n    FROM\n        "players" AS "player"\n    ORDER BY\n        "amount" DESC,\n        "id"\n        LIMIT 5\n    ) ( SELECT * FROM cte ) UNION ALL\n    (\n    SELECT\n        "id",\n        "created_at",\n        CONCAT_WS ( \'|\', LAST_VALUE ( "created_at" ) OVER ( ), LAST_VALUE ( "id" ) OVER ( ) ) AS note\n    FROM\n        cte -- THIS IS CORRECT\n    LIMIT 1\n    )\n
Run Code Online (Sandbox Code Playgroud)\n\n

相反go-pg一直给我这个:

\n\n
WITH "cte" AS (\n    SELECT\n        "player"."id",\n        "player"."created_at",\n        "player"."note"\n    FROM\n        "players" AS "player"\n    ORDER BY\n        "amount" DESC,\n        "id"\n        LIMIT 5\n    ) ( SELECT * FROM "cte" ) UNION ALL\n    (\n    SELECT\n        "id",\n        "created_at",\n        CONCAT_WS ( \'|\', LAST_VALUE ( "created_at" ) OVER ( ), LAST_VALUE ( "id" ) OVER ( ) ) AS note\n    FROM\n        "players" AS "player" -- THIS IS THE PROBLEM, I need "cte" here\n    LIMIT 1\n    )\n
Run Code Online (Sandbox Code Playgroud)\n\n

我正在使用这段代码:

\n\n
var players []*models.Player\n\nqueryAll := r.db.Model(&players).Limit(5)\nqueryNotes := r.db.Model((*models.Player)(nil)).ExcludeColumn("note").Limit(1)\n\nqueryNotes.ColumnExpr("CONCAT_WS ( \'|\', " + lastValues + " ) AS note")\n\nerr := queryAll.WrapWith("cte").Table("cte").UnionAll(queryNotes).Select(&players)\n
Run Code Online (Sandbox Code Playgroud)\n\n

我可以做什么来解决这个问题?

\n