1

我对 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

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

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

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

一行是正确的: 103694-68-4 10.0000 % NOE mouse skin Symrise,2002c Local Lymph Node Assay 在研究条件下,测试材料不太可能是皮肤致敏剂。49523 45957

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

103694-68-4 10.0000 % NOE 小鼠皮肤 Symrise,2002c 局部淋巴结检测 使用丙酮中浓度为 1%、3% 和 10% w/v 的测试材料导致同位素掺入量增加 3 倍以上在 3% 和 10% w/v 浓度下。因此,测试材料被证明是一种皮肤致敏剂,证实了用于研究的协议的有效性。49523 45957

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

4

2 回答 2

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在选择后添加 a 来删除它们。

IE:

 select distinct Study_Results.CASNumber, ...
于 2012-08-31T13:33:47.157 回答
0

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

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

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

于 2012-08-31T13:39:18.877 回答