加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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;

现在,要实际识别特定行所在的表,请使用tableoid

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;

这比循环遍历许多单独的表要快得多.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读