2017-10-20 62 views
0

我是SQL和DBMS的新手,所以我仍然在学习最佳实践,并探索什么是可能的和不可能的。我在Postgres中设计了一个数据库,其中包含6个表:具有外键的卫星数据与CROP数据,其中FK具有FIELDS,FK具有FARMS,具有MET STATION和MET DATA的外键,该外键还具有与MET STATION的外键。 (我希望我已经解释了,好吧..)SQL查询从两个表中输出数据,这些数据不是通过PK/FK直接链接的,而是通过多个其他表链接的?

我假设我可以得到一个输出表,其中包含距彼此最远的两个表(卫星数据和MET数据)的信息,因为有一个链接通过所有其他表通过PK和FKs ..但是我无法制定SQL来这样做。 (我可以设想一个很长的SQL来做到这一点..但如果有可能,我希望有一个更有效的方法..)

我的问题是:是否有SQL做我想在上面一个有效的方式与我已经完成的相同数据库设计?还是应该重新设计我的数据库,以便每个需要链接的表都直接链接而不是通过多个其他表?

在此先感谢您的帮助!

+1

请** [编辑] **您的问题,并添加一些[样本数据](http://plaintexttools.github.io/plain-text-table/)和基于该数据的预期输出。 [**格式化文本**](http://stackoverflow.com/help/formatting)请,[**没有屏幕截图**](http://meta.stackoverflow.com/questions/285551/why-may -i-不上传图像-的代码上那么当灰化-A-问题/ 285557#285557)。 ** [**]您的问题 - 请勿**在论坛中发布代码或其他信息。 –

+0

我试图放入示例数据,但纯文本表格粘贴在预览格式化有趣,看起来一团糟。我认为这样的描述足以让某人回答 - 虽然缺少样本数据的道歉。 –

+0

http://stackoverflow.com/help/formatting –

回答

0
select * 
from one t1 
join six t6 ON exists (
     select * 
     from two t2 
     join three t3 on t3.two_id = t2.two_id 
     join four t4 on t4.three_id = t3.three_id 
     join five t5 on t5.five_id = t4.five_id 
     where t2.one_id = t1.one_id 
     and t5.six_id = t6.six_id 
     ); 

现在,你只需要更换的实际名称表/列名(你没有提供)

+0

感谢您的回复。由于数据通常是从两个表中调用的,所以MET数据和卫星数据表直接由PK和FK链接是否更好?从理论上讲,这是额外的存储需求,所以这就是我设计数据库的原因,因为我相信从数据存储的角度来看,这是更高效的方式。 –

+0

“高效”在数据库建模中具有不同的含义。这关乎正确性和紧凑性以及约束最小化。 https://en.wikipedia.org/wiki/Database_normalization – joop

0

查询并不难。它看起来像这样:

select . . . 
from met_station ms join 
    farms f 
    on ms.farm_id =f.farm_id join 
    fields fi 
    on f.field_id = fi.field_id join 
    crops c 
    on c.crop_id = f.crop_id join 
    satellites s 
    on s.satellite_id = c.satellite_id; 

如果我正确理解数据模型,这些都是1-n关系,并且没有处理连接的问题。你只需要列出它们。而且,假设连接键是主键(在一个表中),性能应该没问题。

当某些表格是n-m时,您确实遇到了挑战。处理多个这样的关系通常涉及在加入之前的聚合。

相关问题