首页 > 解决方案 > 左连接两个表 - 不包括第二个表有超过 1 行的第一个表值的连接;拒绝

问题描述

正如标题所说,我想拒绝行,所以我不会创建重复项。第一步是不要加入第二个表中有更多行的值。

如果需要,这里是一个示例: 表 a:

aa |bb  |
---|----|
1  |111 |
2  |222 |

表 h:

hh |kk  |
---|----|
1  |111 |
2  |111 |
3  |222 |

使用普通左连接:

SELECT
    *
FROM a
LEFT JOIN h
ON a.bb = h.kk
;

我得到:

aa |bb  |hh |kk  |
---|----|---|----|
1  |111 |1  |111 |
1  |111 |2  |111 |
2  |222 |3  |222 |

我想去掉前两行,其中 aa = 1。

...

第二步是另一个查询,可能在某些情况下,表 a 在哪里,我将只过滤掉表 b 中超过 2 行的那些行。因此,我想创建表 c,我将在其中拥有:

aa |bb  |
---|----|
1  |111 |

有人能帮助我吗?谢谢你。

标签: postgresql

解决方案


仅获取1:1联接

SELECT a.aa,h.hh,h.kk FROM a
LEFT JOIN h ON a.bb = h.kk
GROUP BY bb HAVING COUNT(kk)=1

仅获取1:n联接

SELECT a.aa,h.hh,h.kk FROM a
LEFT JOIN h ON a.bb = h.kk
GROUP BY bb HAVING COUNT(kk)>1

推荐阅读