[英]Excluding records from SQL query
由于一个或多个owner_ids
(例如,2,4,6),我想回列表resources.id
链接到owners
的owners_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.deleted
为true
例如,给定owners_ids
2和4,我应该返回resources_id
2和3。请注意,我要说的是deleted=TRUE
表示已删除,但是由于已经发布了使用前一个答案的答案,因此我不会编辑问题。 相反,下面的真值表显示owner_not_deleted
和resource_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.