我有一张桌子Table1
。我的应用程序代码从Table1
读取,如下所示:
Select id, table2_id, table3_id from Table1
我希望它也可以通过更改查询来从表name
和Table2
中返回值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.id
和t3.id
是唯一的列,因此Table2
和Table3
的每个{最多包含1条记录{1}}条记录。如果我要使用用户Table3
,则此更改将是不安全的,因为如果inner join
或Table2
碰巧不包含预期的记录,则查询将不会返回任何结果。
在这种情况下,我的更改安全且正确吗?还是有必要编写一些子查询来加入?
答案 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;
这甚至可以保证没有重复项。如果存在,查询将返回错误。