Mysql 用于在左联接中没有匹配行时获取所有行的SQL查询
我有这样一个表结构:Mysql 用于在左联接中没有匹配行时获取所有行的SQL查询,mysql,sql,Mysql,Sql,我有这样一个表结构: person (pid, pname) personSamples(sid,pid,sampleName) groups(gid,groupName) groupPersons(gpid,gid,pid) grouppersonSamples(gpsid,gid,sid) 每当一个人被添加到一个组(即在groupPersons表中),我都会在grouppersonSamples表中添加一些选定的个人样本 要求是,如果我没有在grouppersonSamples中插入任何行
person (pid, pname)
personSamples(sid,pid,sampleName)
groups(gid,groupName)
groupPersons(gpid,gid,pid)
grouppersonSamples(gpsid,gid,sid)
每当一个人被添加到一个组(即在groupPersons
表中),我都会在grouppersonSamples
表中添加一些选定的个人样本
要求是,如果我没有在grouppersonSamples
中插入任何行,则从personSamples
中为给定的个人和组选择全部
我要做的是左键连接grouppersonSamples
,检查grouppersonSamples
中是否没有匹配的行,然后执行另一个查询,从给定pid的personSamples
中选择所有
是否有任何方法可以在单个查询中获取全部信息?以下查询将为您提供给定人员(pid)的组人员样本(gid、sid),这些样本尚未出现在grouppersonSamples表中: 假设给定人员的pid为3。我没有考虑添加此人的组的gid。如果您想考虑一个特定的组,在下面的查询中添加类似于PID=3条件的GID筛选器。
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;
第一个查询提取给定人员(假设pid=3)的所有可能的组人员样本(gid,sid),第二个查询提取给定人员的grouppersonSamples表中存在的所有组人员样本(gid,sid)
然后,左连接作为减号操作,并为给定人员提供grouppersonSamples表中尚未存在的组人员样本(gid、sid)
您还可以在insert语句中使用上述查询,如下所示:
insert into grouppersonSamples(gid, sid) (<above query>);
插入grouppersonSamples(gid,sid)();
注意:我使用左连接执行减号操作,因为Mysql不支持减号运算符。如果您的DBS支持减号运算符,您可以直接使用减号运算符。您可以在问题中插入您已经尝试过的查询吗?