问题描述:
我在Postgres上创建了一个数据库,它有很多模式,例如:
s1,s2,s3, ..... s1000
每个模式都创建了一个表,例如:
CREATE TABLE s1.demos
(
id bigint NOT NULL DEFAULT s1.next_demos_id(), -- 分片Id
title character varying(255) NOT NULL, -- 标题
CONSTRAINT demos_pkey PRIMARY KEY (id)
)
CREATE TABLE s2.demos
(
id bigint NOT NULL DEFAULT s2.next_demos_id(), -- 分片Id
title character varying(255) NOT NULL, -- 标题
CONSTRAINT demos_pkey PRIMARY KEY (id)
)
我执行SQL使用UNION ALL来选择两个模式数据,例如:
(SELECT *
FROM s2.demos
ORDER BY id ASC
LIMIT 3)
UNION ALL (SELECT *
FROM s1.demos
ORDER BY id ASC
LIMIT 3)
ORDER BY id DESC
结果是:
psql (9.5.0)
Type "help" for help.
migrate_development=# (SELECT * FROM s2.demos ORDER BY id ASC LIMIT 3) UNION ALL (SELECT * FROM s1.demos ORDER BY id ASC LIMIT 3) ORDER BY id DESC;
id | title
----+----------------
21 | s2->1 's title
13 | s1->3 's title
12 | s1->2 's title
11 | s1->1 's title
10 | s2->3 's title
9 | s2->4 's title
(6 rows)
migrate_development=#
两个演示表数据如:
migrate_development=# SELECT * FROM s1.demos;
id | title
----+----------------
11 | s1->1 's title
12 | s1->2 's title
13 | s1->3 's title
14 | s1->4 's title
15 | s1->5 's title
(5 rows)
migrate_development=# SELECT * FROM s2.demos;
id | title
----+----------------
21 | s2->1 's title
22 | s2->2 's title
10 | s2->3 's title
9 | s2->4 's title
25 | s2->5 's title
(5 rows)
migrate_development=#
问题
我知道我可以通过UNION ALL 1000模式获取所有模式的数据,但我想获得任何其他方法吗?
PS。我也用Sphinx来解决,但是,这是另一种服务,还有其他任何敏捷方法?
答案 0 :(得分:3)
您可以使用inheritance postgresql feature
-- create schema for base table and table itself
CREATE SCHEMA s;
CREATE SEQUENCE demos_id_seq START 1;
CREATE TABLE s.demos
(
id bigint NOT NULL DEFAULT nextval('demos_id_seq'),
title character varying(255) NOT NULL,
table_schema text NOT NULL,
CONSTRAINT demos_pkey PRIMARY KEY (id)
);
-- create descendant table 1
CREATE SCHEMA s1;
CREATE TABLE s1.demos (
table_schema text NOT NULL DEFAULT 's1'
) INHERITS (s.demos);
-- create descendant table 1
CREATE SCHEMA s2;
CREATE TABLE s2.demos (
table_schema text NOT NULL DEFAULT 's2'
) INHERITS (s.demos);
-- create descendant table 1
CREATE SCHEMA s3;
CREATE TABLE s3.demos (
table_schema text NOT NULL DEFAULT 's3'
) INHERITS (s.demos);
-- can add table to s1000.demos
-- insert some data for test queries
insert into s1.demos (title) VALUES ('s1.1'), ('s1.2'), ('s1.3'), ('s1.4'), ('s1.5');
insert into s2.demos (title) VALUES ('s2.1'), ('s2.2'), ('s2.3'), ('s2.4'), ('s2.5');
insert into s3.demos (title) VALUES ('s3.1'), ('s3.2'), ('s3.3'), ('s3.4'), ('s3.5');
-- query for 3th top row from each descendant table
SELECT * FROM (
SELECT
ROW_NUMBER() OVER (PARTITION BY table_schema ORDER BY id asc) AS r,
t.*
FROM
s.demos t
) x WHERE x.r <= 3;
此查询返回此输出:
r | id | title | table_schema
---+----+-------+--------------
1 | 1 | s1.1 | s1
2 | 2 | s1.2 | s1
3 | 3 | s1.3 | s1
1 | 6 | s2.1 | s2
2 | 7 | s2.2 | s2
3 | 8 | s2.3 | s2
1 | 11 | s3.1 | s3
2 | 12 | s3.2 | s3
3 | 13 | s3.3 | s3
(9 rows)