PostgreSQL中如何将两个含动态表名的SQL查询合并为单条查询?
合并为单条SQL的实现方案
你可以通过子查询或关联查询直接合并两次查询逻辑,不需要中间存储ID数组,以下是两种常用实现:
1. 子查询写法(最贴合原有逻辑)
直接将第一次查询links的逻辑作为IN的条件嵌入:
SELECT * FROM ${tableName} WHERE parent_id IN ( SELECT id FROM links WHERE parent_id = ${typeId} AND name = 'instance' ) AND name = ${key} LIMIT 1;
2. EXISTS关联写法(性能更优)
如果你只需要判断是否存在重复记录,不需要返回具体数据,推荐用EXISTS写法,匹配到第一条符合条件的记录就会终止查询,效率更高:
-- 返回的is_exist字段值为1表示存在重复,0表示无重复 SELECT EXISTS ( SELECT 1 FROM ${tableName} t INNER JOIN links l ON t.parent_id = l.id WHERE l.parent_id = ${typeId} AND l.name = 'instance' AND t.name = ${key} ) AS is_exist;
返回结果直接取反就能得到和你原有函数一致的返回值。
对应Knex写法
你也可以直接在Knex中写单条查询逻辑,不需要拆分两次请求:
async function verifyInteractiveInstanceAttributeIsUnique(typeId, key, val, attrSchema) { const tableName = getTableName(attrSchema.type) const existingRecord = await knex(tableName) .whereExists(function() { this.from('links') .whereRaw('links.id = ??', [`${tableName}.parent_id`]) .where('links.parent_id', typeId) .where('links.name', 'instance') }) .where('name', key) .first() return !existingRecord }
注意所有变量都要走参数化查询,避免SQL注入风险。
内容的提问来源于stack exchange,提问作者Lance Pollard
相关产品推荐
相关产品推荐

