SQLite如何查找引用父表主键且含指定client_id值的关联子表
实现方案
你可以通过SQLite自带的系统表搭配动态查询实现需求,全程不需要提前知道子表名称,步骤如下:
步骤1:筛选所有包含client_id字段的子表
首先通过sqlite_master系统表搭配pragma_table_info,排除父表clients后,找出所有带client_id字段的业务表,SQL语句如下:
SELECT name AS table_name FROM sqlite_master WHERE type = 'table' AND name != 'clients' AND EXISTS ( SELECT 1 FROM pragma_table_info(sqlite_master.name) WHERE name = 'client_id' );
注意:如果你实际场景中
client_id字段名存在大小写不一致、带空格的情况(比如示例里的client _Id、client_Id),可以把过滤条件改成WHERE REPLACE(LOWER(name), ' ', '') = 'clientid'做模糊匹配,避免漏表。
步骤2:生成校验语句筛选符合条件的子表
上面的查询只能拿到所有带client_id的表,我们需要进一步判断每个表中是否存在client_id = 1的记录,SQLite不支持直接动态执行SQL,所以可以用下面的语句自动生成批量校验的SQL:
SELECT 'SELECT ''' || name || ''' AS matched_table WHERE EXISTS (SELECT 1 FROM ' || quote(name) || ' WHERE client_id = 1) UNION ALL' FROM sqlite_master WHERE type = 'table' AND name != 'clients' AND EXISTS ( SELECT 1 FROM pragma_table_info(sqlite_master.name) WHERE REPLACE(LOWER(name), ' ', '') = 'clientid' );
把上面语句执行后得到的结果复制出来,删掉最后一行末尾的UNION ALL,再执行修改后的语句,就能直接输出所有存在client_id=1记录的子表。拿你给出的示例来说,最终执行后返回的结果就是Form Table1和form Table3,完全符合需求。
内容的提问来源于stack exchange,提问作者Youness El Azzaoui
相关产品推荐
相关产品推荐

