sql - 查找所有不包含所提供资源的人员
问题描述
下面是表格
CREATE TABLE Person(
PersonID INT PRIMARY KEY,
FirstName VARCHAR(10),
LastName VARCHAR(10));
CREATE TABLE Resources(
ResourceID CHAR(3) PRIMARY KEY
);
CREATE TABLE PR (
PersonID INT,
ResourceID CHAR(3),
CONSTRAINT pkpr PRIMARY KEY (PersonID, ResourceID),
CONSTRAINT fkPersonID FOREIGN KEY (PersonID) REFERENCES Person(PersonID),
CONSTRAINT fkResourceID FOREIGN KEY (ResourceID) REFERENCES Resources(ResourceID));
INSERT INTO Person(PersonID, FirstName, LastName) VALUES (1, 'Bill', 'Smith'),(2, 'John','Jones'), (3, 'Tim', 'Jolt');
INSERT INTO Resources (ResourceID) VALUES ('ABC'),('DEF'),('HIJ');
INSERT INTO PR (PersonID, ResourceID) VALUES (1,'ABC'),(1,'DEF'),(2,'ABC'), (2,'HIJ'), (1,'HIJ'), (3, 'DEF');
如何找到所有没有资源的人('ABC','HIJ')?
使用上面插入的数据,它应该返回人 Tim Jolt
我正在使用 PostgreSql。
解决方案
您可以通过以下 4 种方式编写查询:
- 使用NOT IN:Pratik Soni回答的相同
select personid from person
where personid not in ( select personid from PR where resourceid in ('ABC', 'HIJ'))
- 使用不存在:
select personid from person t1
where not exists (select 1 from PR where personid=t1.personid and resourceid in ('ABC', 'HIJ'))
- 使用<> ALL:
SELECT personid FROM person WHERE
personid <> ALL(select personid from PR where resourceid in ('ABC', 'HIJ'))
- 使用LEFT JOIN 和 IS NULL
SELECT p.personid
FROM person p
LEFT JOIN PR r ON p.personid = r.personid AND r.resourceid in ('ABC', 'HIJ')
where r.personid is null
所有 4 种方法都有各自的优缺点。没有人可以在没有看到Explain Analyze
结果的情况下预测表现。因此,使用上述所有查询和真实数据检查执行计划,并据此决定应该采用哪种方法。
推荐阅读
- html - 如何在 div 中为 CSS 选择多个元素
- python - 如何使用正则表达式将字符串元素转换为列表?
- python - 无法使用 Python 从 html 文件中提取查找/提取所有标签
- node.js - 节点将数据从一个视图解析到另一个视图
- python - 为什么我必须明确地写出一个列表才能使这个函数起作用?
- c# - 如何使用 PublicKey.EncodedKeyValue.Format(true) 从 X509Store 获取公钥
- javascript - 如何从节点模块导入 css?
- java - 复选框上的列表视图滚动问题
- calliope - 是否有可能使用 makecode.calliope.cc 控制 RGB LED?
- git - Git - 按分支/标签名称递归列出文件