如何根据具有条件的另一个表数据过滤表?

时间:2018-10-23 12:54:21

标签: postgresql postgresql-10

这是folders表:

+------------+
| id  name   |
|------------|
|  1  dir1   |
|  2  dir2   |
+------------+

这是files表:

+------------------------------+
| id  folder_id  name  deleted |
|------------------------------|
|  1  1          file1 true    |
|  2  1          file2 false   |
|  1  2          file3 true    |
|  2  2          file4 true    |
+------------------------------+

如您所见,dir1dir2每个目录有2个文件。但是在dir1中,只有一个文件被删除,一个文件可用。但是,dir2有2个文件,但都删除了。因此,没有文件保留在那里。

我想要做的是获取没有任何文件(都已删除)的文件夹表和目录。

到目前为止,我尝试了此操作,但没有成功。

SELECT
    "dirs".* 
FROM
    "dirs"
    INNER JOIN "files" ON ( "files"."folder_id" = "folders"."id" ) 
WHERE
    ( "files"."deleted" IS FALSE ) 
GROUP BY
    "folders".ID 
HAVING
    COUNT ( files.ID ) != 0 /* or > 0 or == 0 */

预期结果:

+------------+
| id  name   |
|------------|
|  2  dir2   |
+------------+

因为dir2有文件,但已全部删除。

1 个答案:

答案 0 :(得分:2)

使用where not exists

select *
from folders d
where not exists (
    select 1
    from files f
    where folder_id = d.id
    and not deleted)

Working example in rextester.