每个组内的 SQL 连接

标签 sql postgresql

假设我有 Table1(A, B, C) 和 Table2(B)

Table1:
A    |    B    |    C
------------------------
a1        b1        c1
a1        b2        c2 
a2        b1        c3
Table2:
B   
--
b1     
b2       
b3       
b4

我想要的结果:

A   |   B   |   C
-------------------
a1      b1      c1
a1      b2      c2
a1      b3    [some default value]
a1      b4    [some default value]
a2      b1      c3
a2      b2    [some default value]
a2      b3    [some default value]
a2      b4    [some default value]

我该怎么做?

本质上,我需要一种方法来右外连接 table1 和 table2,但是“分组依据”列 A。

最佳答案

您可以通过CROSS JOINTable1A 的不同值与B< 的值来实现您想要的结果Table2 然后 LEFT JOIN 再次连接到 Table1 以获取相应的 C 值,使用 COALESCE 在没有匹配的 C 值时提供默认值:

SELECT t1.A, t2.B, COALESCE(t3.C, 'c0') AS C
FROM (SELECT DISTINCT A
      FROM Table1) t1
CROSS JOIN Table2 t2
LEFT JOIN Table1 t3 ON t3.A = t1.A AND t3.B = t2.B

输出:

a   b   c
a1  b1  c1
a1  b2  c2
a1  b3  c0
a1  b4  c0
a2  b1  c3
a2  b3  c0
a2  b2  c0
a2  b4  c0

Demo on dbfiddle

关于每个组内的 SQL 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58812248/

相关文章:

json - Postgres : expand JSON array elements into values with their index?

postgresql - 如何在 postgresql 中转换为用户定义的类型

PostgreSQL 插入依赖于另一个表中的数据,最佳实践?

Sql:两个日期之间的差异

mysql - 查询另一个查询的结果时出现错误

mysql - SQL:获取负值

python - 尝试使用 SQLAlchemy 将字符串插入 PostgresQL BYTEA 列时出现 UTF-8 错误

java - 在 Jform(GUI) 的 3 个组合框中显示来自 java DB 的日期字段

sql - 不使用 Max()/Greatest() 函数查找最大组值

sqlite - 导入后更新 SERIAL 值