sql – 根据表值找出哪个模式
发布时间:2020-12-12 06:05:53 所属栏目:MsSql教程 来源:网络整理
导读:我的数据库被分成基于客户端的模式(即:每个客户端都有自己的模式,具有相同的数据结构). 我也碰巧有一个外部动作,不知道它应该针对哪个架构.它来自系统的另一部分,它没有客户端的概念,也不知道它在哪个客户端设置中运行.在我处理它之前,我必须找出请求需要定
我的数据库被分成基于客户端的模式(即:每个客户端都有自己的模式,具有相同的数据结构).
我也碰巧有一个外部动作,不知道它应该针对哪个架构.它来自系统的另一部分,它没有客户端的概念,也不知道它在哪个客户端设置中运行.在我处理它之前,我必须找出请求需要定位的模式 为了找到正确的模式,我必须找出哪个包含特定唯一ID的记录R(字符串) 从我的理解,以下 SET search_path TO schema1,schema2,schema3,... 将只查看schema1中的表(或与表匹配的第一个模式),并且不会进行全局搜索. 有没有办法让我在所有模式中进行全局搜索,或者我只需要使用for循环并迭代所有模式,一次一个? 解决方法你可以使用 inheritance. (一定要考虑 limitations.)考虑这个小演示: CREATE SCHEMA master; -- no access of others .. CREATE SEQUENCE master.myseq; -- global sequence to have globally unique id CREATE table master.tbl ( id int primary key DEFAULT nextval('master.myseq'),foo text); CREATE SCHEMA x; CREATE table x.tbl() INHERITS (master.tbl); INSERT INTO x.tbl(foo) VALUES ('x'); CREATE SCHEMA y; CREATE table y.tbl() INHERITS (master.tbl); INSERT INTO y.tbl(foo) VALUES ('y'); SELECT * FROM x.tbl; -- returns 'x' SELECT * FROM y.tbl; -- returns 'y' SELECT * FROM master.tbl; -- returns 'x' and 'y' <-- !! -- clean it all up: -- DROP SCHEMA x,y,master CASCADE; 现在,要实际识别特定行所在的表,请使用 SELECT *,tableoid::regclass AS table_name FROM master.tbl WHERE id = 2; 结果: id | foo | table_name ---+-----+----------- 2 | y | y.tbl 您可以从tableoid派生源模式,最好是直接使用tableoid查询系统目录. (显示的名称取决于search_path的设置.) SELECT n.nspname FROM master.tbl t JOIN pg_class c ON c.oid = t.tableoid JOIN pg_namespace n ON c.relnamespace = n.oid WHERE t.id = 2; 这比循环遍历许多单独的表要快得多. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |