2012-08-31 33 views
1

我使用下面的语法的SQL SELECT查询从多个表(使用续集专业)提取数据:SQL SELECT查询语法奎德里

select Study_Results.CASNumber, Study_Results.Dose, Study_Results.Units, Study_Results.Effects, Studies.Species, Studies.Route, Studies.Result, ToxData_References.BriefReference, Studies.Study, Studies.Summary 
from Study_Results, Studies, ToxData_References 
where Study_Results.ProtocolID = Studies.ProtocolID 
AND Studies.Location = ToxData_References.Location 
AND Studies.Study = "Local Lymph Node Assay" 
order by Study_Results.CASNumber 

查询运行并没有一个错误完成,但是当我查看结果,有不匹配数据的记录副本---即,查询结果中似乎不同的记录被错误地组合在一起。

问题:我的语法有什么问题导致数据不匹配?

下面是一些样本输出(实际和预期)

一行是正确的: 103694-68-4 10.0000%NOE小鼠皮肤德之馨,2002C局部淋巴结实验在研究的条件下,试验材料不太可能成为皮肤敏感剂。 49523 45957

但第二排我从不同的Study_Results.CASNumber适用相同Study_Results.CASNumber数据:

103694-68-4 10.0000%NOE小鼠皮肤德之馨,2002C局部淋巴结实验中的应用的丙酮浓度为1%,3%和10%w/v的测试材料在3%和10%w/v浓度下导致同位素掺入增加3倍以上。因此,测试材料显示为皮肤敏化剂,证实了用于该研究的方案的有效性。 49523 45957

上述数据实际上适用于不同的CASNumber。

+1

很难说。你会添加3个表格的样本数据,你得到的输出样本和你期望的输出样本吗? – automatic

+0

三张桌子的定义也会有所帮助。您可能不会加入正确的(或者全部)外键/主键。 –

+1

我认为他仍然从'Study_Results'和'ToxData_References'获得交叉连接,因为该关系没有在WHERE条款 – JNK

回答

2

人们普遍认为,现代ANSI语法是更好

select Study_Results.CASNumber, Study_Results.Dose, Study_Results.Units, Study_Results.Effects, Studies.Species, Studies.Route, Studies.Result, ToxData_References.BriefReference, Studies.Study, Studies.Summary 
from Study_Results 
    inner join Studies on Study_Results.ProtocolID = Studies.ProtocolID 
    inner join ToxData_References on Studies.Location = ToxData_References.Location 
where Studies.Study = "Local Lymph Node Assay" 
order by Study_Results.CASNumber 

如果发现重复是有效的,根据您的资料,您可以通过添加之后选择一个distinct删除它们。

即:

select distinct Study_Results.CASNumber, ... 
+0

谢谢!事实证明,重复项无效。 “重复”记录被错误地拉​​入 - 并且与另一个唯一ID相关联。 –

+0

修好了!原来我错过了最重要的连接条件:AND St​​udies.CASNumber = Study_Results.CASNumber感谢您的帮助! –

0

的原因重复是你必须匹配表中的多个记录。这些倍数存在的一个或两个地方:

  • 位置,研究和ToxDataReferences之间
  • Protocol_id,研究和Studies_Results

如果每个表都有一个唯一的ID的,你可以得到一个通过计算出现次数的想法:

select Study_Results.CASNumber, 
     count(distinct sr.StudyResultsId), 
     count(distinct s.ProtocolId), 
     count(distinct tdr.ToxDataReferencesId) 
from Study_Results sr inner join 
    Studies s 
    on sr.ProtocolID = s.ProtocolID inner join 
     ToxData_References tdr 
    on s.Location = tdr.Location 

您可能希望在没有唯一性的表中使用唯一性。也许你错过了一个连接条件。也许数据与你的理解有点不同。

+0

谢谢!我刚刚发布的示例输出没有以一种看起来很有帮助的方式发布。我可以附上一个文本文件供您查看吗? –

+0

这非常有帮助。显示不正确的变量是Study_Results.CASNumber。在一种情况下,查询结果提供的输出与Study_Results.CASNumber正确匹配,然后错误的重复提供了不同的数据,但将它连接到不正确的Study_Results.CASNumber –

+0

修复了它!原来我错过了最重要的连接条件:AND St​​udies.CASNumber = Study_Results.CASNumber感谢您的帮助! –