sql – 根据表值找出哪个模式

前端之家收集整理的这篇文章主要介绍了sql – 根据表值找出哪个模式前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我的数据库被分成基于客户端的模式(即:每个客户端都有自己的模式,具有相同的数据结构).

我也碰巧有一个外部动作,不知道它应该针对哪个架构.它来自系统的另一部分,它没有客户端的概念,也不知道它在哪个客户端设置中运行.在我处理它之前,我必须找出请求需要定位的模式

为了找到正确的模式,我必须找出哪个包含特定唯一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;

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

原文链接:https://www.f2er.com/mssql/84019.html

猜你在找的MsSQL相关文章