我有一个像这样的表结构:
person (pid, pname)
personSamples(sid,pid,sampleName)
groups(gid,groupName)
groupPersons(gpid,gid,pid)
grouppersonSamples(gpsid,gid,sid)
每当一个人被添加到一个组(即groupPersons
表中)时,我会在grouppersonSamples
表中添加一些选定的人物样本。
要求是,如果我没有在grouppersonSamples
中插入任何行,则从personSamples
为给定的人和组选择全部。
我要做的是左连接和grouppersonSamples
并检查grouppersonSamples
中是否没有匹配的行,然后执行另一个查询以从{{1}中选择所有内容对于给定的pid。
有没有办法让所有人都进行单一查询?
答案 0 :(得分:1)
以下查询将为您提供给定人员(pid)的group-person-samples(gid,sid),这些人员样本表格中尚未存在:
假设给定人的pid是3.我没有考虑添加此人的群组的gid。如果您想考虑特定的组,请在以下查询中添加gid过滤器,类似于pid = 3条件。
select T1.gid, T1.sid from
(select gid, sid from groupPersons, personSamples where groupPersons.pid = personSamples.pid and groupPersons.pid = 3) as T1
LEFT JOIN
(select grouppersonSamples.gid, grouppersonSamples.sid from personSamples, groupPersons, grouppersonSamples where personSamples.pid = 3 and personSamples.pid = groupPersons.pid and grouppersonSamples.gid = groupPersons.gid and grouppersonSamples.sid = personSamples.sid) as T2
ON T1.gid = T2.gid and T1.sid = T2.sid where T2.gid IS NULL;
第一个查询提取给定人的所有可能的组人样本(gid,sid)(比如pid = 3),第二个查询提取grouppersonSamples表中给出的所有group-person-samples(gid,sid)给定人
然后LEFT JOIN作为MINUS操作,并为给定的人提供groupperson-samples-samples(gid,sid),这些人不存在于grouppersonSamples表中。
您也可以在insert语句中使用上述查询,如下所示:
insert into grouppersonSamples(gid, sid) (<above query>);
P.S。:我使用LEFT JOIN来执行减号操作,因为Mysql不支持MINUS运算符。如果您的DBS支持,您可以直接使用MINUS运算符。