繁体   English   中英

如何安全地加入这些表?

[英]How to join these tables safely?

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

Select id, table2_id, table3_id from Table1

我希望它也通过像这样更改我的查询来从表Table2Table3返回值name

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记录每个Table3的记录。 如果我是用户inner join ,则此更改将不安全,因为如果Table2Table3碰巧不包含预期记录,我的查询将不会返回任何结果。

对于这种情况,我的更改是否安全且正确? 或者是否有必要编写一些子查询来加入?

您的查询看起来很安全:

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;

这更能保证没有重复。 如果存在,查询将返回错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM