![](/img/trans.png)
[英]How do I select rows in table (A) sharing the same foreign key (itemId) where multiple rows in table have the values in table B
[英]POSTGRESQL : How do I select values A that have multiple pairing values for B?
背景
我有一个用于跟踪用户帐户更改的表。 a列是这个accounthistory-table的主键, b列是一个外键,包含account-table中一个账户的主键, c列包含更改时的用户名, d列有时间戳更改和e列描述了执行的操作是什么,来自选项 INSERT / UPDATE / DELETE。
在给定时间,只能有一个用户名c 的帐户b ,但跨时间多个帐户b可以具有相同的用户名值c (参见表中的示例 b=20 和 b=07)。 由于还有其他列,所有帐户都可以有多个 UPDATE 或 INSERT + UPDATE,因此每个c值应该在插入一段时间后至少有 2 行。
题:
下面是一个数据示例。 我需要弄清楚的是“至少更改了一次用户名的帐户”,因此b 的值具有多行, c 的值不同。 我只对b列的值感兴趣,因为我需要在进一步的选择查询中使用结果。
表accounthistory:
一种 | 乙 | C | d | 电子 |
---|---|---|---|---|
100 | 15 | 托马 | 2021-11-15 16:22:40.747766 | 更新 |
99 | 20 | 瓦尔特 | 2021-11-13 08:22:40.747766 | 更新 |
98 | 17 | 米特克 | 2021-11-12 15:22:40.747766 | 插入 |
97 | 15 | 托米亚 | 2021-11-10 08:22:40.747766 | 更新 |
96 | 20 | 瓦尔特 | 2021-11-09 07:22:40.747766 | 插入 |
95 | 15 | 托米亚 | 2021-10-21 20:22:40.747766 | 插入 |
94 | 12 | 亚力克 | 2021-10-18 18:22:40.747766 | 插入 |
93 | 07 | 瓦尔特 | 2021-10-15 10:22:40.747766 | 删除 |
92 | 04 | 尤尔 | 2021-10-12 10:22:40.747766 | 删除 |
91 | 07 | 瓦尔特 | 2021-10-05 10:22:40.747766 | 插入 |
预期结果将是 15,因为它同时具有用户名 'tomia' 和 'toma',其他b 's 只有c 的匹配值,并且 07 和 20 都具有用户名 'valt' 并不重要,因为 07 是在添加 20 之前删除。
那么有没有办法为b选择这些值,我尝试形成不同的 group by 和其他凌乱的查询,但由于我在使用 postgresql 和 sql 方面是新手,所以我一直无法让它工作。
先感谢您!
您可以使用exists
来确定哪一列b
至少有 1 列c
不具有相同的列c
。 然后使用distinct on
来消除重复项。 演示在这里。
select distinct on (b) b
from accounthistory ah1
where exists (
select null
from accounthistory ah2
where ah2.b = ah1.b
and ah2.c <> ah1.c
)
order by b;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.