1
-- from http://www.depesz.com/index.php/2010/04/19/getting-unique-elements/
3
CREATE TEMP TABLE articles (
4
id int CONSTRAINT articles_pkey PRIMARY KEY,
6
title text UNIQUE NOT NULL,
11
CREATE TEMP TABLE articles_in_category (
15
PRIMARY KEY (article_id, category_id)
18
-- test functional dependencies based on primary keys/unique constraints
22
-- group by primary key (OK)
23
SELECT id, keywords, title, body, created
27
-- group by unique not null (fail/todo)
28
SELECT id, keywords, title, body, created
32
-- group by unique nullable (fail)
33
SELECT id, keywords, title, body, created
37
-- group by something else (fail)
38
SELECT id, keywords, title, body, created
44
-- group by primary key (OK)
45
SELECT a.id, a.keywords, a.title, a.body, a.created
46
FROM articles AS a, articles_in_category AS aic
47
WHERE a.id = aic.article_id AND aic.category_id in (14,62,70,53,138)
50
-- group by something else (fail)
51
SELECT a.id, a.keywords, a.title, a.body, a.created
52
FROM articles AS a, articles_in_category AS aic
53
WHERE a.id = aic.article_id AND aic.category_id in (14,62,70,53,138)
54
GROUP BY aic.article_id, aic.category_id;
58
-- group by left table's primary key (OK)
59
SELECT a.id, a.keywords, a.title, a.body, a.created
60
FROM articles AS a JOIN articles_in_category AS aic ON a.id = aic.article_id
61
WHERE aic.category_id in (14,62,70,53,138)
64
-- group by something else (fail)
65
SELECT a.id, a.keywords, a.title, a.body, a.created
66
FROM articles AS a JOIN articles_in_category AS aic ON a.id = aic.article_id
67
WHERE aic.category_id in (14,62,70,53,138)
68
GROUP BY aic.article_id, aic.category_id;
70
-- group by right table's (composite) primary key (OK)
72
FROM articles AS a JOIN articles_in_category AS aic ON a.id = aic.article_id
73
WHERE aic.category_id in (14,62,70,53,138)
74
GROUP BY aic.category_id, aic.article_id;
76
-- group by right table's partial primary key (fail)
78
FROM articles AS a JOIN articles_in_category AS aic ON a.id = aic.article_id
79
WHERE aic.category_id in (14,62,70,53,138)
80
GROUP BY aic.article_id;
83
-- example from documentation
85
CREATE TEMP TABLE products (product_id int, name text, price numeric);
86
CREATE TEMP TABLE sales (product_id int, units int);
89
SELECT product_id, p.name, (sum(s.units) * p.price) AS sales
90
FROM products p LEFT JOIN sales s USING (product_id)
91
GROUP BY product_id, p.name, p.price;
94
SELECT product_id, p.name, (sum(s.units) * p.price) AS sales
95
FROM products p LEFT JOIN sales s USING (product_id)
98
ALTER TABLE products ADD PRIMARY KEY (product_id);
101
SELECT product_id, p.name, (sum(s.units) * p.price) AS sales
102
FROM products p LEFT JOIN sales s USING (product_id)
106
-- Drupal example, http://drupal.org/node/555530
108
CREATE TEMP TABLE node (
110
vid integer NOT NULL default '0',
111
type varchar(32) NOT NULL default '',
112
title varchar(128) NOT NULL default '',
113
uid integer NOT NULL default '0',
114
status integer NOT NULL default '1',
115
created integer NOT NULL default '0',
117
PRIMARY KEY (nid, vid)
120
CREATE TEMP TABLE users (
121
uid integer NOT NULL default '0',
122
name varchar(60) NOT NULL default '',
123
pass varchar(32) NOT NULL default '',
130
SELECT u.uid, u.name FROM node n
131
INNER JOIN users u ON u.uid = n.uid
132
WHERE n.type = 'blog' AND n.status = 1
133
GROUP BY u.uid, u.name;
136
SELECT u.uid, u.name FROM node n
137
INNER JOIN users u ON u.uid = n.uid
138
WHERE n.type = 'blog' AND n.status = 1
142
-- Check views and dependencies
145
CREATE TEMP VIEW fdv1 AS
146
SELECT id, keywords, title, body, created
151
CREATE TEMP VIEW fdv1 AS
152
SELECT id, keywords, title, body, created
157
ALTER TABLE articles DROP CONSTRAINT articles_pkey RESTRICT;
162
-- multiple dependencies
163
CREATE TEMP VIEW fdv2 AS
164
SELECT a.id, a.keywords, a.title, aic.category_id, aic.changed
165
FROM articles AS a JOIN articles_in_category AS aic ON a.id = aic.article_id
166
WHERE aic.category_id in (14,62,70,53,138)
167
GROUP BY a.id, aic.category_id, aic.article_id;
169
ALTER TABLE articles DROP CONSTRAINT articles_pkey RESTRICT; -- fail
170
ALTER TABLE articles_in_category DROP CONSTRAINT articles_in_category_pkey RESTRICT; --fail
177
CREATE TEMP VIEW fdv3 AS
178
SELECT id, keywords, title, body, created
182
SELECT id, keywords, title, body, created
186
ALTER TABLE articles DROP CONSTRAINT articles_pkey RESTRICT; -- fail
191
CREATE TEMP VIEW fdv4 AS
192
SELECT * FROM articles WHERE title IN (SELECT title FROM articles GROUP BY id);
194
ALTER TABLE articles DROP CONSTRAINT articles_pkey RESTRICT; -- fail
199
-- prepared query plans: this results in failure on reuse
202
SELECT id, keywords, title, body, created
208
ALTER TABLE articles DROP CONSTRAINT articles_pkey RESTRICT;