允许查询结果含重复列名:寻求更简便的SQL实现方案
更简便的实现方式
优化后的兼容写法(适配多数数据库)
SELECT sub.u_id AS id, sub.u_name AS name, sub.p_id AS id, sub.price, sub.p_name AS name FROM ( SELECT u.id AS u_id, u.name AS u_name, p.id AS p_id, p.price, p.name AS p_name, DENSE_RANK() OVER (ORDER BY u.id) AS dr FROM user u JOIN product p ON -- 补充你的表关联条件 ) AS sub WHERE sub.dr BETWEEN 1 AND 3 ORDER BY sub.u_id, sub.p_id
思路说明
- 省去了先将产品列重命名为
product_id/product_name再改回的冗余步骤,直接在子查询里用u_/p_前缀做临时区分,外层查询直接映射到ORM要求的重复列名id/name。 - 子查询内列名唯一,避免数据库解析冲突,同时保证最终结果集符合ORM的列名要求。
极简写法(限部分数据库支持)
如果你的数据库允许子查询存在重复列名(如PostgreSQL),可以直接通过表别名区分列,省略子查询内的临时前缀:
SELECT u.id AS id, u.name AS name, p.id AS id, p.price, p.name AS name FROM ( SELECT u.*, p.*, DENSE_RANK() OVER (ORDER BY u.id) AS dr FROM user u JOIN product p ON -- 补充关联条件 ) AS sub WHERE sub.dr BETWEEN 1 AND 3 ORDER BY u.id, p.id
注意:MySQL等部分数据库会对子查询中的重复列名报错,优先推荐使用兼容写法。
内容的提问来源于stack exchange,提问作者dafie
相关产品推荐
相关产品推荐

