繁体   English   中英

从SQL查询中排除记录

[英]Excluding records from SQL query

由于一个或多个owner_ids (例如,2,4,6),我想回列表resources.id链接到ownersowners_has_resources 没问题,我只需SELECT DISTINCT ohr.resources_id FROM owners_has_resources ohr WHERE ohr.owners_id IN (2,4,6);

现在我被卡住了。 我想返回与上面相同的resources.id列表,但排除那些也链接到未删除所有者(由owners.deleted!=true确定)的链接,其中未删除链接(由owners_has_resources.deleted!=true确定) owners_has_resources.deleted!=true

可以假设对于所有最初提供的owners_ids (例如2、4、6), owners.deletedtrue

例如,给定owners_ids 2和4,我应该返回resources_id 2和3。请注意,我要说的是deleted=TRUE表示已删除,但是由于已经发布了使用前一个答案的答案,因此我不会编辑问题。 相反,下面的真值表显示owner_not_deletedresource_not_deleted

+-----------+-------------------+--------------+----------------------+
| owners_id | owner_not_deleted | resources_id | resource_not_deleted |
+-----------+-------------------+--------------+----------------------+
|         2 | FALSE             |            1 | TRUE                 |
|         2 | FALSE             |            2 | TRUE                 |
|         4 | FALSE             |            2 | TRUE                 |
|         4 | FALSE             |            3 | TRUE                 |
|         5 | TRUE              |            1 | FALSE                |
|         5 | TRUE              |            2 | TRUE                 |
|         7 | TRUE              |            2 | FALSE                |
+-----------+-------------------+--------------+----------------------+

owners
- id (INT PK)
- name, etc
- deleted (true/false)

resources
- id (INT PK)
- name, etc

owners_has_resources
- owners_id (INT PK REFERENCES owners.id)
- resources_id (INT PK REFERENCES resources.id)
- deleted (true/false)

关于什么

SELECT DISTINCT ohr.resources_id 
FROM owners_has_resources ohr 
JOIN owners o ON ohr.owners_id = o.id
WHERE ohr.owners_id IN (2,4,6)
AND (o.deleted = FALSE OR ohr.deleted = FALSE);

首先,选择所需的数据,然后仅在NOT EXISTS块中选择未删除的所有者未引用的数据

SELECT DISTINCT ohr.resources_id 
FROM owners_has_resources ohr 
JOIN owners o ON ohr.owners_id = o.id
WHERE ohr.owners_id IN (2,4,6)
AND NOT EXISTS (
    SELECT NULL FROM owners_has_resources ohr2 
    JOIN owners o2 ON ohr2.owners_id = o2.id
    WHERE ohr2.deleted=FALSE 
    AND o2.deleted=FALSE
    AND ohr.resources_id=ohr2.resources_id 
)
SELECT DISTINCT ohr1.resources_id
FROM owners_has_resources ohr1
LEFT OUTER JOIN owners_has_resources ohr2 ON ohr2.resources_id=ohr1.resources_id AND ohr2.deleted = TRUE
LEFT OUTER JOIN owners o ON o.id=ohr2.owners_id AND ohr2.deleted = TRUE
WHERE ohr1.owners_id IN (2,4,6) AND o.id IS NULL;

要么

SELECT DISTINCT ohr1.resources_id
FROM owners_has_resources ohr1
LEFT OUTER JOIN owners_has_resources ohr2 ON ohr2.resources_id=ohr1.resources_id
LEFT OUTER JOIN owners o ON o.id=ohr2.owners_id
WHERE ohr1.owners_id IN (2,4,6) AND o.id IS NULL AND ohr2.deleted = TRUE AND ohr2.deleted = TRUE;

对于一种方法是否比另一种方法更好的任何评论,我将不胜感激。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM