我有User包含由周围不同实体表示的同一用户的表。例如
id name 1 John Doe
2 Doe, John 3 Nicholas Cage 4 BlackRiderXXX 5 Nicholas cage 其中用户John Doe,Doe, John,BlackRiderXXX是同一人。另外,Nicholas Cage和Nicholas cage是同一个人。其他表根据哪个用户对象执行了操作随机引用user.id。
对于Action桌子,它看起来像
id user_id some_other_stuff 1 1 ... 2 2 ... 3 1 ... 4 4 ... 5 3 ... 其中动作1,2,3,4全部由John Doe完成。
我将由用户手动合并这些用户,这意味着我们知道谁是谁。他们还将选择哪个用户作为他们的主要用户帐户,因此我们也需要知道此信息。
我只是在简化一点,但我有一打表格,就像我上面提供的“动作”表格一样。关于如何查询,我们主要有两个用例:
1)查找由用户X执行的操作(应检查属于用户X的所有用户实体) 2)查找操作并将唯一用户分组
要点是,我们将在100多个查询中的代码库中各处使用它,因此我们希望对其进行良好的设计。我该如何构建一个查询简单而又功能强大以处理不同查询方式的系统?
谢谢
PS:我们正在使用PostgreSQL 问题来源于stack overflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
您可以使用regexp_replace(),initcap()而且trim()功能完善和提取的通用名称的字符串进行分组,然后生成新创造的价值action_id取决于其列:
with new_action0 as ( select u.id as id, case when strpos(u.name,',') > 0 then initcap(trim(regexp_replace(trim(u.name),'(.),(.)','\2 \1'))) else
case when lower(trim(u.name))='blackriderxxx' then 'John Doe' else trim(initcap(u.name)) end end as name from action u ) select n.id, dense_rank() over (order by n.name) as user_id from new_action0 n;