我有一个带有 3 个内部选择的 sql 选择:
select t1.a, t2.b, t3.c
from (select aa as a from ...) as t1 <-- query 1
(select bb as b from ...) as t2 <-- query 2
(select cc as c from ...) as t3 <-- query 3
where
t1.id = t2.id and t2.id = t3.id
查询 1 的结果集有 5 行。 查询 2 的结果集有 5 行。 查询 3 的结果集有 2 行。
所以我的 sql 只显示两行,因为查询 3 有 2 行并且我有一个 where 条件:t1.id = t2.id 和 t2.id = t3.id。
但最后我想看到 5 行,其中查询 1 或/和 2 没有我想要获得的任何结果或默认值。
如果我删除 where 条件,那么我会如我所料得到很多记录,但这也不正确。
能告诉我怎么解决吗?
编辑:
情况是这样的:
+--------+
| client |
+--------+
|
+------------------+
| client_benchmark |
| |
| + fk_client_id |
| + fk_kpi_id |
| + value |
| + last_update |
+------------------+
|
+------+
| kpi |
+------+
insert into kpi (ID, NAME, ALIAS_NAME...) values (1, 'kpi 1'...);
insert into kpi (ID, NAME, ALIAS_NAME...) values (2, 'kpi 2'...);
insert into kpi (ID, NAME, ALIAS_NAME...) values (3, 'kpi 3'...);
insert into KPI (ID, NAME, ALIAS_NAME...) values (4, 'kpi 4'...);
...
insert into client_benchmark (ID, CLIENT_ID, KPI_ID, VALUE...) values (1, 1, 1, a1_1...);
insert into client_benchmark (ID, CLIENT_ID, KPI_ID, VALUE...) values (2, 1, 2, b1_2...);
...
insert into client_benchmark (ID, CLIENT_ID, KPI_ID, VALUE...) values (3, 2, 1, a2_1...);
insert into client_benchmark (ID, CLIENT_ID, KPI_ID, VALUE...) values (4, 2, 1, b2_2...);
insert into client_benchmark (ID, CLIENT_ID, KPI_ID, VALUE...) values (5, 2, 1, c2_3...);
insert into client_benchmark (ID, CLIENT_ID, KPI_ID, VALUE...) values (6, 2, 1, d2_4...);
insert into client_benchmark (ID, CLIENT_ID, KPI_ID, VALUE...) values (7, 2, 1, e2_5...);
...
insert into client_benchmark (ID, CLIENT_ID, KPI_ID, VALUE...) values (8, 3, 1, a3_1...);
insert into client_benchmark (ID, CLIENT_ID, KPI_ID, VALUE...) values (9, 3, 2, b3_2...);
...
我想显示这个:
client_id | kpi_1.name | kpi_1.value | kpi_2.name | kpi_2.value | kpi_3.name | kpi_3.value
----------+------------+-------------+------------+-------------+------------+------------
1 | 'kpi 1' | a1_1 | 'kpi 2' | b1_2 | <null> | <null>
2 | 'kpi 1' | a2_1 | 'kpi 2' | b2_2 | 'kpi 3' | c2_3
3 | 'kpi 1' | a3_1 | 'kpi 2' | b3_2 | <null> | <null>
我需要一个快速有效的 sql,其中包含尽可能少的 sql join 命令,我想为此创建一个 View 表。
我使用 postgreSQL 服务器。
谢谢。
最佳答案
你想要一个 LEFT JOIN
:
select
t1.a
,t2.b
,t3.c
from table1 as t1
left join table2 as t2
on t1.id = t2.id
left join table3 as t3
on t2.id = t3.id
除非您的子查询中有复杂的逻辑,否则如果您只在 FROM
中指定表名可能会更具可读性。
关于SQL + 具有不同行集的内部选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21858193/