首页 > 解决方案 > 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 目前对我不起作用。

标签: sql

解决方案


您可以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')

推荐阅读