我有两个表,proj: id name和proj_reports: id, position, created_at, key_id, proj_id我想从选择key_reports每个proj_id:
- total number of `key_id` which can be done with `count(.key_id)`
- total number of DISTINCT `key_id` `count(DISTINCT .key_id)`
- total number of `key_id` where `position` > 1
- total number of `key_id` where `position` > 2 AND < 5
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是我不知道如何添加这些条件来检查位置是 > 或 < 一个数字还是在一个范围内。
我正在使用 PostgreSSQL 8.3。
我想执行这个查询:
select COALESCE(col_fr,col,'Unknown') from my_table where id = 'abc';
Run Code Online (Sandbox Code Playgroud)
故事中的扭曲是列名colum_fr应该动态生成。my_table对于不同的语言有不同的列。就像是:
id col col_ja col_fr
Run Code Online (Sandbox Code Playgroud)
我在水晶报告中使用此查询,我可以在其中传递语言的字符串参数:
select COALESCE(col_||{?parameter},col,'Unknown') from my_table where id = 'abc';
Run Code Online (Sandbox Code Playgroud)
如果{?language}value 是,它将在内部转换为如下内容fr:
select COALESCE(col_||'fr',col,'Unknown') from my_table where id = 'abc';
Run Code Online (Sandbox Code Playgroud)
这永远不会奏效。
我不想使用选择大小写,使其动态化。
作为替代解决方案,我还尝试创建一个存储过程:
CREATE OR REPLACE FUNCTION get_policy_name (
id text,
lang text,
def_value text
)
RETURNS SETOF record AS
$body$
DECLARE
sql text;
BEGIN
sql := 'SELECT COALESCE(col_'||quote_ident(lang)||',col,'||quote_literal(def_value)||')FROM my_table WHERE id ='||quote_literal(id);
RETURN QUERY EXECUTE …Run Code Online (Sandbox Code Playgroud) postgresql stored-procedures dynamic-sql plpgsql postgresql-8.3
假设您有一张桌子groups和一张桌子item。每个项目都属于一个组。它是该群体的固有组成部分。一个项目不能存在于一个组之外,也不能移动到另一个组中。
当试图决定item表的主键时,我应该使用什么?
我应该像这样组成一个人工全局序列键:
CREATE TABLE items
(
item serial PRIMARY KEY,
group integer NOT NULL REFERENCES groups(group),
);
Run Code Online (Sandbox Code Playgroud)
...或者我应该使用复合键和每组项目序列,如下所示:
CREATE TABLE items
(
group integer NOT NULL REFERENCES groups(group),
item integer NOT NULL,
PRIMARY KEY(group, item)
);
Run Code Online (Sandbox Code Playgroud)
我更倾向于第二种解决方案的原因是帖子 URL 将始终显示组和项目,因此将它们都作为复合主键是有意义的。在第一种解决方案的情况下,URL 包含多余的信息,因为组 ID 已经可以单独从项目 ID 中推导出来。但是,URL 结构是给定的,不能更改。
第二种解决方案的缺点是您必须管理每个组的序列(即每个组的每个项目整数应从 0 开始)。
在最佳实践、规范化和性能方面哪个更好?或者这只是品味问题?
所以我有一个像 Master -> Slave1 -> Slave2 这样的设置。Slave1 从 Master 复制,Slave2 从 Slave1 复制。如果我将 Slave1 提升为 master,Slave2 是否可以继续从 Slave1 进行复制。这是我将 Slave1 提升为 master 后在 Slave2 上看到的日志:
2014-06-13 04:28:11 UTC LOG: replication terminated by primary server
2014-06-13 04:28:11 UTC DETAIL: End of WAL reached on timeline 3 at 3E/62B2C758.
2014-06-13 04:28:11 UTC LOG: fetching timeline history file for timeline 4 from primary server
2014-06-13 04:28:11 UTC LOG: invalid record length at 3E/62B2C758
2014-06-13 04:28:11 UTC LOG: restarted WAL streaming at 3E/62000000 on …Run Code Online (Sandbox Code Playgroud) PostgreSQL 复制是单线程的吗?有没有什么工具可以实现多线程复制?
我问这个是因为 Mariadb 支持这个,目前我正在学习这两个数据库。
有没有办法轻松检查 PostgreSQL 数据库是否有任何 GiST 索引以及它们是什么类型?
这个问题涉及获取列表。所以我明白了:
$ psql --list
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
----------------+----------+----------+-------------+-------------+-----------------------
testdb1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
odoo | openerp | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
odoo-demo | openerp | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
odoo8 | openerp | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
Run Code Online (Sandbox Code Playgroud)
我可以psql --list|grep UTF8|awk '{ print $1 }'用来获取仅包含数据库的列表。可psql也直接给我一个干净的有用列表?
我正在尝试帮助一位在 PostgreSQL 查询方面遇到问题的同事。
我们将它缩小到一个表的连接,这使得查询变得非常缓慢,并且经过调查,我们发现即使是对“数据”表的简单 select * 请求也需要长达 2 分钟才能返回结果。
该表包含 420,000 条记录和 13 列,其中没有一个是 BLOB 或任何大量内容(它们都是文本)。
运行 EXPLAIN ANALYZE VERBOSE 大大低估了返回结果所需的时间
即对于 SELECT * FROM DATA
"Seq Scan on data (cost=0.00..18284.35 rows=389735 width=27)
(actual time=0.135..594.929 rows=426934 loops=1)"
" Output: id,..."
"Total runtime: 1069.643 ms"
Run Code Online (Sandbox Code Playgroud)
而在没有 EXPLAIN 的情况下运行查询会给出
Total query runtime: 86598 ms.
426934 rows retrieved.
Run Code Online (Sandbox Code Playgroud)
如果我在提问时违反了任何惯例,我很抱歉,但我根本不了解 Postgres,所以如果有人能建议我们应该寻找什么样的潜在问题来帮助解决这个问题,我将不胜感激已收到。
编辑:根据要求,表定义
CREATE TABLE data
(
id text NOT NULL,
methodid text NOT NULL,
replicateid text,
t_id text NOT NULL,
t_name text NOT …Run Code Online (Sandbox Code Playgroud) 我正在使用以下命令向 PostGIS-2.1.3 (PostgreSQL-9.1.14) 中的光栅图像之一添加约束。
ALTER TABLE schema1.table1 ADD CONSTRAINT enforce_scalex_rast unique (rast);
Run Code Online (Sandbox Code Playgroud)
但得到以下错误:
ERROR: data type raster has no default operator class for access method "btree"
HINT: You must specify an operator class for the index or define a default operator class for the data type.
Run Code Online (Sandbox Code Playgroud)
请有人帮我解决这个错误。我对运算符类没有基本的了解。谢谢。
齐亚。
我在stackoverlow上问过同样的问题,但没有得到答案,所以这就是我在这里问的原因(我读过应该在 SO 上问简单的 sql 问题,但我别无选择)。
假设我有 3 个表:posts,post_categories和categories. 我正在实现某种带有过滤器的页面,我可以在其中按类别过滤帖子。用户可以选择多个类别。当他选择多个时,它们应该相加。我无法让它工作。我现在拥有的是简单的IN()SQL 子句:
SELECT posts.id, post_categories.category_id FROM posts
JOIN post_categories ON posts.id = post_categories.post_id
WHERE post_categories.category_id IN (1,2,3) LIMIT 10;
Run Code Online (Sandbox Code Playgroud)
但它并不匹配所有的 id,它是OR,我需要AND. 我在这里需要的是查找类别为 的所有帖子id=1 AND id=2 AND id=3,但此查询返回IN()列表中至少有一个类别的帖子。
postgresql ×10
replication ×2
constraint ×1
dynamic-sql ×1
gist-index ×1
plpgsql ×1
postgis ×1
primary-key ×1
raster ×1
scripting ×1