PostgreSQL从3个表中加入数据


70

我是PostgreSQL的新手,正在尝试编写查询。我敢肯定,对于知道他们在做什么的人来说这很容易-我只是不知道!:)

基本上我有三个表。首先,我存储有关患者的详细信息。在第二篇中,我存储了对它们每个图像的引用。在第三部分中,我存储了指向图像文件路径的链接。我没有设计数据库,所以我不确定为什么要分离图像文件表,但是确实如此。

我想要做的是从第一个表中选择数据,然后从第二个表至第三个表中加入数据,因此我最终得到了结果中的名称和文件路径。

所以基本结构是:

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...)。


1
在您粘贴问题之前,向我们展示您已经尝试过什么以及完成了哪些研究将非常有用。它会突出显示您首先尝试自己解决问题的事实。
Darkman '18

Answers:


142

就像是:

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

这里需要做些小改动:我的要求就像t2.image_id!= t3.image_id,但是条件不起作用........我还需要做什么?
萨蒂

20

也许以下是您正在寻找的:

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

@digitaljoel我不明白为什么这样做很危险,尤其是因为OP似乎有表,他明确选择了匹配的列名。为什么不利用这个优势呢?
Daniel Frey

16
假设下个月在表1中添加了一个名为“ last_used”的列,指示用户上次登录的时间。一个月之后,他还在表3中添加了一个名为“ last_used”的列,该列指示了上次显示图像的时间。现在自然连接是否还会不正确地尝试应用这些列,突然他的查询返回的信息比以前少得多,而且他不知道为什么,因为新列是在原始列的间隔一个月又两个月后添加的查询写了吗?
digitaljoel 2013年

1
有趣-我不了解自然连接。我认为在这种情况下,我将使用上面的答案,但以后使用起来又方便又肮脏……
John Cleary 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.