获取分组时映射到 objectid 的 id 时遇到问题

问题描述 投票:0回答:1
 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

sql postgresql relational-division
1个回答
0
投票

这看起来是一个关系除法没有余数问题。您现有的解决方案“几乎”是正确的。它正在做 With 余数。 只需将

INNER JOIN

更改为

LEFT JOIN
逻辑如下:

如果您进行内连接,则
    COUNT(*)
  • 将仅包含实际匹配的
    candidate
    行。因此,它将始终匹配有或没有剩余集。
    如果您左连接,那么您将要求 
  • candidate
  • 中的 all 行。然后您需要将其作为
    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);

db<>小提琴

© www.soinside.com 2019 - 2024. All rights reserved.