【发布时间】:2023-04-06 18:11:01
【问题描述】:
表格
用户
| id | name | is_active | |
|---|---|---|---|
| 1 | john | john@albert.com | FALSE |
| 2 | mike | mike@ss.com | TRUE |
| 3 | monica | monica@dunno.com | TRUE |
| 4 | joey | joey@as.com | FALSE |
| 5 | ross | ross@boss.com | FALSE |
订阅
| id | house_id | plan name | status |
|---|---|---|---|
| 1 | 1 | A banana a month | inactive |
| 2 | 2 | An apple a month | active |
| 3 | 3 | A pear a month | active |
房子
| id | name |
|---|---|
| 1 | John's House |
| 2 | Mike's House |
| 3 | Monica's House |
| 4 | Joey's House |
| 5 | Ross's House |
House_Contact(旧表)
| id | house_id | is_primary |
|---|---|---|
| 1 | 1 | TRUE |
| 2 | 2 | FALSE |
| 2 | 3 | TRUE |
House_User(新表)
| id | house_id | is_owner | user_id |
|---|---|---|---|
| 1 | 2 | FALSE | 2 |
| 2 | 4 | FALSE | 4 |
| 3 | 5 | FALSE | 5 |
预期结果
结果表应包括以下内容:
- 无论状态如何,用户是否都有订阅?如果是,请包括,如果不是,请忽略。
- 从用户表中获取
email&is_active(如果他们有订阅) - 获取
is_primary或is_owner(如果他们有订阅) - 结果应该是不同的(没有重复的用户)
| house_id | is_owner | is_active | |
|---|---|---|---|
| 1 | john@albert.com | TRUE | FALSE |
| 2 | mike@ss.com | FALSE | TRUE |
| 3 | monica@dunno.com | TRUE | TRUE |
我尝试了什么
SELECT
u.email AS "email",
u.is_active AS "is_active",
h.id AS "house_id",
is_owner
FROM
house c
INNER JOIN (
SELECT
house_id,
user_id
FROM
house_user) hu ON h.id = hu.house_id
INNER JOIN (
SELECT
id,
email,
is_active
FROM
USER) u ON hu.user_id = u.id
INNER JOIN (
SELECT
id,
email,
is_primary
FROM
house_contact) hc ON u.email = ch.email
INNER JOIN (
SELECT
house_id,
is_primary is_owner
FROM
house_contact
UNION
SELECT
house_id,
is_owner is_owner
FROM
house_user) t ON u.id = t.house_id)
ORDER BY
u.email
结果是我删除 INNER JOIN 和 UNION 语句的一半。不知道如何继续。
我对统一列和可能的重复感到特别困惑。
【问题讨论】:
-
你能用英语解释一下结果吗?逻辑不明显。还不清楚这些表是如何相互关联的。它们都有 id,但什么 id 对应什么?
-
你能为这个问题创建一个fiddle 吗?
-
你为什么要做
....INNER JOIN (SELECT ..... table ) ON....而不是更简单的..INNER JOIN table ON ....??? -
当数据中没有真值时,
is_owner如何变为“真”? -
这不是您尝试的代码。 “用户”是保留字。
FROM USER会引发错误。您是否简化了表名?最后是无与伦比的)。另外:如果is_primary和is_owner同时存在,那么哪个优先?我们需要知道显示所有约束(特别是 PK、FK 和 NOT NULL)的实际表定义才能确定。并且总是你的 Postgres 版本,以防万一。
标签: sql postgresql duplicates left-join greatest-n-per-group