Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 优化查询以从两个表中获取结果_Postgresql - Fatal编程技术网

Postgresql 优化查询以从两个表中获取结果

Postgresql 优化查询以从两个表中获取结果,postgresql,Postgresql,假设我有一个名为Document的db表,其中包含我拥有的所有文档的行。我有另一个名为Shared的db表,它包含我可以读/写的所有文档(由其他人拥有)的记录 Document id type user_id permissions Shared id document_id used_id permissions 我试图编写一个查询,让我返回我(给定一个用户id)拥有并有权访问的所有文档。我的尝试是这样的: Select id, type, user_id, permissions fro

假设我有一个名为Document的db表,其中包含我拥有的所有文档的行。我有另一个名为Shared的db表,它包含我可以读/写的所有文档(由其他人拥有)的记录

Document
id
type
user_id
permissions

Shared
id
document_id
used_id
permissions
我试图编写一个查询,让我返回我(给定一个用户id)拥有并有权访问的所有文档。我的尝试是这样的:

Select id, type, user_id, permissions from Document where user_id = 123
union all
Select id, type, user_id, permissions from Document where id in
                                   (select document_id from shared where user_id = 123)

上面的内容似乎有点冗长,所以我想知道是否有更简洁/高效的方法来编写上面的内容(如果它能工作的话)

尝试使用left join+where子句

Select d.id, d.type, d.user_id, d.permissions from Document d
left join shared s on s.document_id = d.id
                    and s.user_id = d.user_id
where d.user_id = 123
and s.document_id IS NOT NULL

尝试使用左join+where子句

Select d.id, d.type, d.user_id, d.permissions from Document d
left join shared s on s.document_id = d.id
                    and s.user_id = d.user_id
where d.user_id = 123
and s.document_id IS NOT NULL

我在sql方面有点经验不足,但我认为文档的联接需要两个表中都有相同的文档?在某些情况下,我希望文档表中仅针对我的文档,而文档表中不存在针对我的文档,但我确实可以访问共享表中的文档,因为我的用户标识位于该表中的一行,即左join+where子句所在的行。基本上,它将包括
共享
表中存在的
文档
表中的所有条目,如果在
共享
表中找不到条目,它将返回空数据集,这就是
where
子句出现的地方。我也更新了答案,以使用正确的列名来防止出现模棱两可的列名错误。我尝试了一个简单的版本,但没有完全发挥作用:嗨,我看了你的小提琴,看到你的文档id=4,我想应该是1。我对sql有点缺乏经验,但是我认为文档_id=d.id上的连接要求两个表中都有相同的文档?在某些情况下,我希望文档表中仅针对我的文档,而文档表中不存在针对我的文档,但我确实可以访问共享表中的文档,因为我的用户标识位于该表中的一行,即左join+where子句所在的行。基本上,它将包括
共享
表中存在的
文档
表中的所有条目,如果在
共享
表中找不到条目,它将返回空数据集,这就是
where
子句出现的地方。我也更新了答案,以使用正确的列名来防止出现模棱两可的列名错误。我尝试了一个简单的版本,但没有完全起作用:嗨,我看了你的小提琴,看到你的文档id=4,我想应该是1