sql - SQL 返回 where IN 列表而不是任何其他值
问题描述
我试图找到所有纯粹来自/发往一个组织而不是任何其他组织的内部通信。
CREATE TABLE emails
(
Id INT,
from_org VARCHAR(50)
);
CREATE TABLE users
(
emailId INT,
FullName VARCHAR(50) NOT NULL,
Organisation VARCHAR(50) NOT NULL
);
INSERT INTO emails (Id, from_org)
VALUES (1, 'ABC Pty Ltd'), (2, 'ABC Pty Ltd'),
(3, 'Point Pty Ltd'), (4,'ABC Pty Ltd');
INSERT INTO users (emailId, FullName, Organisation)
VALUES (1, 'John Smith', 'ABC Pty Ltd'),
(1, 'Maria Jones', 'Point Pty Ltd'),
(2, 'Ben Coria', 'ABC Pty Ltd'),
(3, 'Leo Sen', 'Point Pty Ltd'),
(4, 'Leo Sen', 'Point Pty Ltd');
在这种情况下,我想查找来自“ABC Pty Ltd”(emails.from_org)的所有电子邮件以及发送给内部用户(users.Organisation = 'ABC Pty Ltd')的电子邮件。我目前的查询是:
SELECT *
FROM emails
LEFT JOIN users ON emails.Id = users.emailId
WHERE emails.from_org = 'ABC Pty Ltd'
AND users.organisation = 'ABC Pty ltd'
输出:
| Id | from_org | emailId | FullName | Organisation |
+-----+-------------+---------+------------+--------------+
| 1 | ABC Pty Ltd | 1 | John Smith | ABC Pty Ltd |
| 2 | ABC Pty Ltd | 2 | Ben Coria | ABC Pty Ltd |
预期结果:
| Id | from_org | emailId | FullName | Organisation |
+-----+-------------+---------+------------+--------------+
| 2 | ABC Pty Ltd | 2 | Ben Coria | ABC Pty Ltd |
返回值是因为 emailId '2' 是 from_org 'ABC Pty Ltd' 并且只发往 'ABC Pty Ltd' 而没有其他组织。
sqlfiddle 目前对我不起作用。
解决方案
您可以NOT EXISTS
按如下方式使用:
SELECT *
FROM emails
LEFT JOIN users u ON emails.Id = u.emailId
WHERE emails.from_org = 'ABC Pty Ltd'
AND u.organisation = 'ABC Pty ltd'
AND NOT EXISTS (select 1 from users uu
where uu.emailId = u.emailId and u.organisation <> 'ABC Pty ltd')
推荐阅读
- web - 在具有帐户系统的网站上创建 Snake
- ruby-on-rails - Rails 5:防止基于 IP 地址访问 /admin 页面
- javascript - 使用jquery合并动态创建的表的选定单元格
- c# - REST JSON,服务器限制 50 条记录,获取所有记录(使用当前示例更新)
- spring - 验证在 url 中传递的请求令牌
- layout - 关于灵活的 Flutter 布局问题
- r - 将一列添加到引用外部 R 的矩阵中
- security - ABAP 安全存储:如何存储密码?
- jquery - 验证输入类型单选
- java - XML 顶部的 DOCTYPE 中断 Jersey 导入