CREATE TABLE Candidate (
runId bigint,
objectId bigint,
name VARCHAR(100)
);
INSERT INTO Candidate(runId, objectId, name) VALUES (1, 401, 'object1');
INSERT INTO Candidate(runId, objectId, name) VALUES (1, 402, 'object2');
INSERT INTO Candidate(runId, objectId, name) VALUES (1, 403, 'object3');
INSERT INTO Candidate(runId, objectId, name) VALUES (1, 404, 'object4');
INSERT INTO Candidate(runId, objectId, name) VALUES (2, 401, 'object1');
INSERT INTO Candidate(runId, objectId, name) VALUES (2, 402, 'object2');
INSERT INTO Candidate(runId, objectId, name) VALUES (2, 403, 'object3');
INSERT INTO Candidate(runId, objectId, name) VALUES (2, 404, 'object4');
INSERT INTO Candidate(runId, objectId, name) VALUES (2, 405, 'object5');
INSERT INTO Candidate(runId, objectId, name) VALUES (2, 406, 'object6');
INSERT INTO Candidate(runId, objectId, name) VALUES (2, 406, 'object7');
以 CTE 形式查询数据:
提议
对象ID | 名字 |
---|---|
401 | '对象1' |
402 | '对象2' |
403 | '对象3' |
404 | '对象4' |
SELECT c.runid
FROM candidate c
INNER JOIN proposed p ON c.objectid = p.objectid AND c.name = p.name
GROUP BY c.runid
HAVING COUNT(DISTINCT c.objectid) = (SELECT COUNT(*) FROM proposed);
输出:
鲁尼德 |
---|
1 |
2 |
预期产出
鲁尼德 |
---|
1 |
候选者已在数据库中存在记录。我已根据查询而来的数据创建了建议的 CTE。我想将
objectid
、name
映射为 candidate.objectid
、candidate.name
。链接的 runId
必须具有与建议的 where p.objectid=c.objectid and p.name=c.name
相同数量的记录。在候选表 runid 中不应有额外或更少的记录链接到该runId
。
这看起来是一个关系除法没有余数问题。您现有的解决方案“几乎”是正确的。它正在做 With 余数。 只需将
INNER JOIN
更改为
LEFT JOIN
。逻辑如下:
如果您进行内连接,则
COUNT(*)
candidate
行。因此,它将始终匹配有或没有剩余集。如果您左连接,那么您将要求 candidate
proposed
的确切行数,这只有在所有行都匹配时才会发生。
SELECT c.runid
FROM candidate c
LEFT JOIN proposed p ON c.objectid = p.objectid AND c.name = p.name
GROUP BY c.runid
HAVING COUNT(*) = (SELECT COUNT(*) FROM proposed);