SQL查询在左连接中没有匹配行时获取所有行

时间:2016-10-15 07:27:53

标签: mysql sql

我有一个像这样的表结构:

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。

有没有办法让所有人都进行单一查询?

1 个答案:

答案 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运算符。