我正在尝试将我的简单查询优化为更复杂的查询。
我有三个桌子
Table 1
a_id info
1 talk
2 talk
3 sleep
4 sit
Table 2
key data_1 data_2 a_id g_id dat_3
1 6.4 3.2 1 1 a
2 5.6 3.5 1 2 a
3 4.6 6.7 1 3 b
4 1.2 2.3 2 4 c
5 0.9 5.6 3 5 c
6 1.1 1.5 4 6 b
Table 3
g_id dat_1 dat_2
1 x t
2 x b
3 y o
4 y t
Psuedo code
#get a_ids from table 1
for each a_id:
extract unique g_id from table 2
for each g_id:
count number of a,b,and c using union from
我已经使用循环和简单查询实现了上述psuedo代码(在postgresql中)。如您所见,我必须运行太多查询。这极大地减慢了该过程。我该如何仅使用1个大查询来完成此操作-快得多?
示例-循环跑步以进行交谈,睡眠和坐下。
可以说-
a_ids将为1,2。
对于1,它将找到1,2,3作为g_id。
对于每个g_id,它将计算a,b和c的数量。 数到最后。
必填输出为:
info a_id g_id a b c
talk 2 3 2 1 1
sleep 1 1 0 0 1
sit 1 1 0 1 0
我是Postgresql数据库的新手,正在进入复杂的查询。请在这里帮助我。如果您不喜欢这个问题,请告诉我,我们将删除它。不要投票。谢谢!
答案 0 :(得分:1)
您可以尝试使用条件汇总函数
来JOIN
CREATE TABLE Table1(
a_id INT,
info VARCHAR(5)
);
INSERT INTO Table1 values (1,'talk');
INSERT INTO Table1 values (2,'talk');
INSERT INTO Table1 values (3,'sleep');
INSERT INTO Table1 values (4,'sit');
CREATE TABLE Table2(
a_id INT,
g_id INT,
dat_3 VARCHAR(5)
);
INSERT INTO Table2 values (1,1,'a');
INSERT INTO Table2 values (1,2,'a');
INSERT INTO Table2 values (1,3,'b');
INSERT INTO Table2 values (2,4,'c');
INSERT INTO Table2 values (3,5,'c');
INSERT INTO Table2 values (4,6,'b');
查询1 :
SELECT t1.info,
COUNT(DISTINCT t1.a_id) a_id,
COUNT(DISTINCT t2.dat_3) g_id,
sum((dat_3 = 'a')::int) a,
sum((dat_3 = 'b')::int) b,
sum((dat_3 = 'c')::int) c
FROM Table1 t1
INNER JOIN Table2 t2 on t1.a_id = t2.a_id
group by t1.info
order by t1.info desc
Results :
| info | a_id | g_id | a | b | c |
|-------|------|------|---|---|---|
| talk | 2 | 3 | 2 | 1 | 1 |
| sleep | 1 | 1 | 0 | 0 | 1 |
| sit | 1 | 1 | 0 | 1 | 0 |
注意
sum((dat_3 = 'a')::int)
可以使用bool将sum
转换为int,如果条件为true
则使用1
,否则使用0
sum
条件取决于dat_3
列。您可以在逻辑中动态添加条件。