在 PostgreSQL 中,我有一个抽象的表,如下所示:
╔═══╦═══╦═══╦═══╗
║ A ║ B ║ C ║ D ║
╠═══╬═══╬═══╬═══╣
║ x ║ 0 ║ y ║ 0 ║
║ x ║ 0 ║ x ║ 1 ║
║ x ║ 1 ║ y ║ 0 ║
║ x ║ 1 ║ z ║ 1 ║
║ y ║ 0 ║ z ║ 0 ║
║ y ║ 0 ║ x ║ 0 ║
║ y ║ 1 ║ y ║ 0 ║
╚═══╩═══╩═══╩═══╝
我想在查询中将其转换为:
╔═══╦═══╦══════╗
║ A ║ B ║ D ║
╠═══╬═══╬══════╣
║ x ║ 0 ║ 1 ║
║ x ║ 1 ║ null ║
║ y ║ 0 ║ null ║
║ y ║ 1 ║ 0 ║
╚═══╩═══╩══════╝
……这样:
- 输入表的行按 A 和 B 分组,并且
对于每个 A 和 B 对:
如果输入表有任何行使得 A = C,则输出表有一行 (A, B, D),其中 D 来自 A = C 的同一行。
例如,输入表有一行 (x, 0, x, 1),其中 A 和 C 都是 x。这意味着输出表有一行 (x, 0, 1),因为 D 为 1。 (x, 0, y, 0) 行(因为它也有 A = x 和 B = 0)被丢弃。
否则,如果不存在这样的行,则输出表有一行(A,B,null)。
例如,输入表有两行,其中 A = y 和 B = 0——它们是 (y, 0, z, 0) 和 (y, 0, x, 0)。在这两行中都没有 A = C。这意味着输出表有 (y, 0, null) 行。