SQL SELECT查询语法quandry

时间:2012-08-31 13:23:55

标签: sql select syntax

我正在使用以下语法进行SQL SELECT查询以从多个表中提取数据(使用Sequel Pro):

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

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

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

这是一些示例输出(实际和预期)

一行是正确的: 10.00%NOE小鼠皮肤Symrise,2002c局部淋巴结测定在研究条件下,测试材料不太可能是皮肤致敏物。 49523 45957

但我得到的第二行将相同的Study_Results.CASNumber应用于来自不同Study_Results.CASNumber的数据:

10.00%NOE小鼠皮肤Symrise,2002c局部淋巴结测定在丙酮中以1%,3%和10%w / v的浓度应用测试材料导致大于3倍的增加同位素掺入浓度为3%和10%w / v时。因此,测试材料显示为皮肤致敏物,证实了用于该研究的方案的有效性。 49523 45957

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

2 个答案:

答案 0 :(得分: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, ...

答案 1 :(得分:0)

重复的原因是您在表中有多个匹配的记录。这些倍数出现在这些地方的一个或两个地方:

  • 研究和ToxDataReferences之间的位置
  • Protocol_id,在Studies and 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

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