Select InterfaceDist命令中的可能错误

时间:2018-10-14 00:59:20

标签: mysql sql inner-join

我是使用SQL的新手。我想知道此程序中是否可能存在错误。

/* Insert to interface table all atoms that have diffASA>0*/
insert into NinterfaceAtom(PDB,Chain,Residue,ResId,Symbol,atom,diffASA)
select PDB,Chain,Residue,ResId,Symbol,Atom,max(ASA)-min(ASA) from perAtomASA
group by PDB,Chain,Residue,ResId,Symbol,Atom
having stddev(ASA)>0;
/* Insert to interface table all atoms that have enough distance */
insert ignore into NinterfaceAtoms (PDB,Chain,Residue,ResId,Symbol,atom)
select asa.PDB,asa.Chain,asa.Residue,asa.ResId,asa.Symbol,dist.Atom from interfaceDist dist
inner join
    perAtomASA asa
on
    dist.PDB=asa.PDB and
    dist.Chain=asa.Chain and
    dist.ResId=asa.ResId and
    dist.Symbol=asa.Symbol and
    Seperated=0

我只是不确定为什么在我之前的程序员在内部连接部分中将asa.PDB而不是dist.PDB放在了里面。 我当时认为第八行需要更改为:

select asa.PDB,asa.Chain,asa.Residue,asa.ResId,asa.Symbol,dist.Atom from interfaceDist dist

收件人:

select dist.PDB,dist.Chain,dist.Residue,dist.ResId,dist.Symbol,dist.Atom from interfaceDist dist

对吗?谢谢。

1 个答案:

答案 0 :(得分:0)

您正在加入asadist。逻辑上检查它们的值以确保结果中仅匹配对是合乎逻辑的。因此,除非您有充分的理由认为这一点

dist.PDB=asa.PDB

您需要dist.PDB而不是asa.PDB,此命令看起来是正确的。如果这是正确的

dist.PDB=dist.PDB

那么这将是微不足道的,并且完全检查这一部分将毫无意义。识别错误时,您要么需要查看软件的行为问题,要么需要了解正在查看的代码。

编辑

在select子句中,可以使用asa.PDBdist.PDB,因为由于on条件确保它们相等,因此两者相等。如果两者不同,则该对将不在结果中。因此,就价值而言,这没有什么区别。但是,如果在dist.PDB中包含select更直观,则您可能希望对其进行更改(其中无害,因为值完全相同),因此代码会更多可读性强,以后,如果更改了代码,并且两者不再必须相等,那么您将不会遇到新的错误。