基于条件返回特定匹配值表的SQL查询

基于条件返回特定匹配值表的SQL查询,sql,postgresql,logic,Sql,Postgresql,Logic,我在PostgreSQL数据库中有3个表: 人员id、姓名、姓氏、年龄 兴趣id、头衔、人员\u id参考人员 位置id、城市、州文本不为空、国家、人员id引用人员 城市可以为空,但州和国家不能为空。 一个人可以有很多兴趣,但只有一个地点。我的挑战是返回一张有着相同兴趣和位置的人的表格 所有ID都是序列化的,因此会自动创建。 假设我有4个人居住在德克萨斯州,他们每个人都有两个兴趣爱好,但只有1人和3人有相似的兴趣爱好,比如说枪支毕竟是德克萨斯州的原因。我需要从人员表中选择所有人员,其中人员的兴趣

我在PostgreSQL数据库中有3个表:

人员id、姓名、姓氏、年龄 兴趣id、头衔、人员\u id参考人员 位置id、城市、州文本不为空、国家、人员id引用人员 城市可以为空,但州和国家不能为空。 一个人可以有很多兴趣,但只有一个地点。我的挑战是返回一张有着相同兴趣和位置的人的表格

所有ID都是序列化的,因此会自动创建。 假设我有4个人居住在德克萨斯州,他们每个人都有两个兴趣爱好,但只有1人和3人有相似的兴趣爱好,比如说枪支毕竟是德克萨斯州的原因。我需要从人员表中选择所有人员,其中人员的兴趣标题是自动生成的,因为id是自动生成的,两个枪的兴趣将导致两个不同的id键等于另一个人的兴趣标题,并且城市或州也相等

我在这里看这个问题的答案,我觉得逻辑和我的问题有点类似,不同的是他有两个表,在我有三个表的地方连接在一起

返回具有相同兴趣和位置的人员表

我将其解释为TablePerson中的所有行,其中存在至少共享一个感兴趣的匹配行和位置中的匹配行的另一行。没有特别的订单

在子查询中使用窗口函数的简单解决方案:

选择p* 从…起 选择个人id作为id、i.头衔、l.城市、l.州、l.国家 ,按i.title、l.city、l.state、l.country划分为ct 出于兴趣,我 使用person\u id加入位置l x 使用id加入personp 其中x.ct>1; 这会将空值视为相等。你没有明确说明

根据未公开的基数,可能会有更快的查询样式。比如首先减少重复的兴趣和/或地点

旁白1:

几乎总是有一个专栏的生日或出生年份比年龄要好,因为年龄会马上开始腐烂

旁白2:

一个人只能有[…]个位置

您至少可以在location.person\u id上添加一个唯一约束来强制执行该约束。如果不能将其设置为PK,或者只是将位置列附加到person表中