2010-04-25 38 views
1

在SQL中,如果我们只想找到交集,我们是否总是可以将内部联接语句编写为主查询和子查询,反之亦然?在SQL中,如果我们只想找到交集,我们是否可以总是将内部联接语句编写为主查询和子查询?

例如,

select * from gifts g where g.giftID in (select giftID from sentGifts); 

可以做一个连接,并显示在sentGifts表送礼物,但它无法显示sentTime因为那是子查询中。但是,如果我们所关心的只是找到交叉点,而不关心正在显示的内容,那么我们总是可以将其中一个转换为另一个?

回答

1

不,你只能这样做,如果你加入一个列。当表格通过多部分键连接时,它不起作用。

例如:

select g.* from gifts g 
join sentGifts s on s.Number=g.Number and s.Name=g.Name 

如果两个表上只有唯一标识符(编号,名称)的组合,那么有没有办法转换到上述子查询式的语句。

+0

你的意思是这样的:select * from gifts g其中g.id in(从sentGifts s中选择giftId,其中s.Id = g.Id和s.Id2 = g.Id2) – Oded 2010-04-25 10:38:40

+0

这是行不通的。我假设两个表都有多部分键的情况。 – Blorgbeard 2010-04-25 10:41:11

+0

为了清晰起见编辑 – Blorgbeard 2010-04-25 10:44:13

0

在设定条件下,两个查询都会找到两个集合的交集,所以使用哪种形式并不重要。

您将始终可以将一种形式转换为另一种形式。

作为一个实际应用的问题 - 如果对JOIN使用基于集合的方法(它们更适合连接),大多数RDBMS将表现得更好。正如你所提到的,还有返回结果集的问题 - 如果你需要两组数据,你必须使用连接。

相关问题