【问题标题】:PostgreSQL JOIN data from 3 tables来自 3 个表的 PostgreSQL JOIN 数据
【发布时间】:2013-03-25 20:09:03
【问题描述】:

我是 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...的答案)。

【问题讨论】:

  • 在粘贴问题之前向我们展示您已经尝试过什么以及完成了哪些研究会很有用。它会突出您尝试自己先解决它的事实。

标签: postgresql


【解决方案1】:

类似:

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,但是条件不起作用........我还有什么需要做的吗?
【解决方案2】:

也许您正在寻找以下内容:

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

【讨论】:

  • @digitaljoel 我不明白为什么它很危险,特别是因为 OP 似乎有他明确选择匹配列名的表。为什么不利用这个优势呢?
  • 假设下个月在 table1 中,他添加了一个名为“last_used”的列,表示用户上次登录的时间。一个月后,他还在 table3 中添加了一个名为“last_used”的列,表示最后一次登录显示图像的时间。现在自然连接不会不正确地尝试应用这些列吗?突然,他的查询返回的信息比以前少得多,他不知道为什么,因为新列是相隔一个月和两个月后添加的查询已写入?
  • 有趣 - 我不知道自然连接。我认为在这种情况下,我将使用上面的答案,但方便将来快速和肮脏的使用......
猜你喜欢
  • 2011-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 2016-07-27
相关资源
最近更新 更多