2013-04-03 76 views
37

我是PostgreSQL的新手,试图获得写入的查询。我很确定,知道自己在做什么的人很容易 - 我只是不知道! :)PostgreSQL从3个表中加入数据

基本上我有三个表。首先,我存储有关患者的详细信息。第二,我存储对他们每个图像的参考。第三,我存储链接到图像的文件路径。我没有设计数据库,所以我不知道为什么图像文件表是分开的,但它是。

我希望能够做的是从第一个表中选择数据,从第二个和第三个表中加入数据,所以我最终在结果中名为&文件路径。

所以基本结构是:

Table 1: 
person_id | name 

Table 2: 
person_id | image_id 

Table 3: 
image_id | `path filename` 

我想要做的就是在一个查询,抢人的“姓名”和图像“路径文件名”。

我很满意我需要的连接的“模板”样式的答案。我不需要它写在实际的代码中。 (即我在想你可以给我写一个答案,说“SELECT table1.name,table3.pathfilename FROM JOIN ... etc ...”)。

谢谢! 约翰

+0

这将是有益的向我们展示你尝试过什么已经和什么样的研究有你在完成这个问题之前完成了。它会突出显示你首先尝试自己解决的事实。 – BlueTomato 2018-02-28 09:26:25

回答

74

喜欢的东西:

select t1.name, t2.image_id, t3.path 
from table1 t1 inner join table2 t2 on t1.person_id = t2.person_id 
inner join table3 t3 on t2.image_id=t3.image_id 
+0

谢谢大家!能够完美地适应这一点。 – 2013-04-04 03:01:46

11

也许下面是你在找什么:

SELECT name, pathfilename 
    FROM table1 
    NATURAL JOIN table2 
    NATURAL JOIN table3 
    WHERE name = 'John'; 
+1

哇,自然加入。你每天学习新的东西。看起来很危险...... – digitaljoel 2013-04-03 22:58:43

+0

@digitaljoel我不明白为什么它很危险,尤其是因为OP似乎有表格,他明确选择了匹配的列名。为什么不使用这个对他有利呢? – 2013-04-03 23:01:36

+11

比方说,在下个月的table1中,他添加了一个名为“last_used”的列,表示用户最后一次登录。在此之后的一个月,他还在table3中添加了一个名为“last_used”的列,该列指示图像最后一次显示的时间。现在的自然连接现在是不是也不适当地尝试应用这些列,并且突然间他的查询返回的信息比以前少得多,他也无法弄清楚为什么,因为新列是在原始文件之后的一个月和两个月后添加的查询被写入? – digitaljoel 2013-04-03 23:15:52