如何安全地加入这些表?

时间:2019-02-21 16:21:53

标签: sql postgresql

我有一张桌子Table1。我的应用程序代码从Table1读取,如下所示:

Select id, table2_id, table3_id from Table1

我希望它也可以通过更改查询来从表nameTable2中返回值Table3

select t1.id, t1.table2_id, t1.table3_id, t2.name, t3.name
from table1 t1
left outer join table2 t2 on t1.table2_id = t2.id
left outer join table3 t3 on t1.table3_id = t3.id

但是,我不想更改原始查询的行为,该查询在Table1中每行返回1个结果。

我相信我对查询所做的更改是安全的,因为它们t2.idt3.id是唯一的列,因此Table2Table3的每个{最多包含1条记录{1}}条记录。如果我要使用用户Table3,则此更改将是不安全的,因为如果inner joinTable2碰巧不包含预期的记录,则查询将不会返回任何结果。

在这种情况下,我的更改安全且正确吗?还是有必要编写一些子查询来加入?

1 个答案:

答案 0 :(得分:1)

您的查询看起来很安全:

select t1.id, t1.table2_id, t1.table3_id, t2.name, t3.name
from table1 t1 left join
     table2 t2 
     on t1.table2_id = t2.id left join
     table3 t3
     on t1.table3_id = t3.id;

您还可以使用相关的子查询(或横向联接)来表达这一点:

select t1.*,
       (select t2.name from table2 t2 where t1.table2_id = t2.id) as t2_name,
       (select t2.name from table3 t3 where t1.table2_id = t3.id) as t3_name,
from table1 t1;

这甚至可以保证没有重复项。如果存在,查询将返回错误。