【发布时间】:2014-10-17 22:26:22
【问题描述】:
我正在尝试获取相关表中某些类型记录的计数。我正在使用左连接。
所以我有一个不太正确的查询并且返回了正确的结果。正确的结果查询具有更高的执行成本。如果我能纠正结果,我想使用第一种方法。 (见http://sqlfiddle.com/#!15/7c20b/5/2)
CREATE TABLE people(
id SERIAL,
name varchar not null
);
CREATE TABLE pets(
id SERIAL,
name varchar not null,
kind varchar not null,
alive boolean not null default false,
person_id integer not null
);
INSERT INTO people(name) VALUES
('Chad'),
('Buck'); --can't keep pets alive
INSERT INTO pets(name, alive, kind, person_id) VALUES
('doggio', true, 'dog', 1),
('dog master flash', true, 'dog', 1),
('catio', true, 'cat', 1),
('lucky', false, 'cat', 2);
我的目标是找回一张桌子,里面有所有的人和他们活着的宠物的种类:
| ID | ALIVE_DOGS_COUNT | ALIVE_CATS_COUNT |
|----|------------------|------------------|
| 1 | 2 | 1 |
| 2 | 0 | 0 |
我让这个例子变得更简单了。在我们的生产应用程序(不是真正的宠物)中,每人大约有 100,000 只死狗和猫。我知道搞砸了,但这个例子更容易传递;)我希望在计数之前过滤掉所有“死”的东西。我现在生产中的查询速度较慢(来自上面的 sqlfiddle),但希望让 LEFT JOIN 版本正常工作。
【问题讨论】:
标签: sql postgresql left-join aggregate-functions