【发布时间】:2015-10-07 13:41:25
【问题描述】:
我想连接四个具有 null 值且不重复的表,然后将其转换为 SQLAlchemy 查询。
表格是(简化的):
Category(id, name)
Task(id, category.id, name)
User(id, name)
还有一个多对多表:
Solved(task.id, user.id)
我想获取所有任务及其类别和解决任务的特定用户的列:
+---------------+-----------+-----------+
| category.name | task.name | user.name |
+---------------+-----------+-----------+
| abc | abctask1 | <null> |
| abc | abctask2 | luke |
| def | deftask1 | <null> |
| ghi | ghitask1 | <null> |
| ghi | ghitask2 | luke |
+---------------+-----------+-----------+
目前我有 3 到 4 个单独的 SQLAlchemy 查询来执行该任务。如果可能,应该将其合并到一个查询中,以避免对数据库进行过多读取。
到目前为止,我得到了:
SELECT DISTINCT
cat.name, t.name, u.name
FROM
Task t
JOIN
Category cat ON cat.id = t.category_id
LEFT JOIN
Solved s ON s.task_id = t.id
LEFT JOIN
User u ON s.user_id = u.id AND
u.name = 'luke'
ORDER BY
cat.name
但是,尽管DISTINCT,我从给定用户的所有行中都得到了重复:
+---------------+-----------+-----------+
| category.name | task.name | user.name |
+---------------+-----------+-----------+
| abc | abctask1 | <null> |
| abc | abctask2 | luke |
| abc | abctask2 | <null> | <-- duplicate
| def | deftask1 | <null> |
| ghi | ghitask1 | <null> |
| ghi | ghitask2 | luke |
| ghi | ghitask2 | <null> | <-- duplicate
+---------------+-----------+-----------+
是否有可能通过一次查询获取此表并将其转换为 SQLAlchemy?
【问题讨论】:
-
记录一下:DISTINCT 只会合并完全相同的行。它不会像 OP 中显示的那样删除“几乎重复的”。
-
显示的结果没有重复。似乎您实际上希望结果中有不同的 tasks (每个任务恰好一行) - 仅当 s(he) 解决了给定用户时?顺便说一句,
User不是没有双引号的有效表名(保留字)。
标签: sql postgresql join sqlalchemy left-join