SQL + 具有不同行集的内部选择

标签 sql postgresql

我有一个带有 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/

相关文章:

c++ - 如何在 postgresql 的 c++ 中使用 pqxx 在 sql 查询中执行 IN?

mysql - MySQL 的 PGDATA 等效项

sql - Oracle SQL 按级别连接

mysql - 根据之前的行获取值

在 PostgreSQL 8.4 中替换 FOLLOWING/PRECEEDING 的 SQL 解决方法

sql - 使用触发器跟踪 PostgreSQL 表的插入或更新或删除更改

postgresql - 如何在 Typesafe conf 上为 Slick 3.0.0 RC1 配置 HikariCP

sql - 将货币换算添加到 SQL 查询

php - 虽然php中的嵌套循环从sql数据库中获取数据

sql - 重用带有更改变量的 SQL 表达式