2010-04-15 59 views
1

我无法弄清楚这些查询之间的区别。我很确定第一个是一个equi-join。我不确定第二个与第一个不一样。 #2中的子查询从S中选择所有的Ids,然后它返回也有这些ID的所有R,不是?在哪里和嵌套查询之间的区别

SELECT R.cname FROM R,S, WHERE R.Id = S.Id

SELECT R.cname 从r WHERE R.Id IN(SELECT S.Id FROM S)

编辑:
我抓住这一关过去的考试....我引用:
虽然查询好像产生他们不一样的答案。他们如何 不同?您可以给出R和S的示例实例,这些实例显示 这两个查询可以产生不同的答案。
R(身份证,TourId,CNAME,caddress,成本)
S(标识,规范ID)

编辑:编辑:
我猜它与重复做。

回答

1

假定这些数据:

R 

id cname 
-- -- 
1 RA 
1 RB 
2 RC 

S 
id cname 
-- -- 
1 SA 
1 SB 
2 SC 
2 SD 

,此查询:

SELECT R.cname 
FROM R, S 
WHERE R.Id = S.Id 

返回

RA 
RA 
RB 
RB 
RC 
RC 

,而这一个:

SELECT R.cname 
FROM R 
WHERE R.Id IN 
     (
     SELECT S.Id 
     FROM S 
     ) 

返回

RA 
RB 
RC 

第一个查询是两个表的一个JOIN:对于每个匹配id它从两个表

的秒查询是一个表具有谓词返回的记录的所有可能的组合。它最多可以返回来自R的每条记录一次。

1

从应用程序开发人员的角度来看,如果您有明确定义的表关系(尤其是连接查询),则子查询和连接查询都可以为您工作。但是,通常情况下,设备连接(或交叉连接哪个数据库处理为设备连接)可以更快,因为数据库可以优化连接查询。但是在子查询的情况下,数据库必须独立运行这两个查询,以便您可能会看到性能略有下降。话虽如此,如果故事中有太多数据并且子查询可能适用于这种情况,那么加入可能会变得缓慢。一般的经验法则是尽可能使用连接。如果您看到一些问题,请尝试子查询。

2

IMO,都是糟糕的选择,因为它们是难以阅读比:

Select R.Naem 
From R 
    Join S 
     On S.ID = R.ID 

超越的功能,在编写代码的首要目标应该是让你的意图明确为其他读者。开发人员必须阅读第一个示例中的逗号,并知道这意味着交叉连接。第二,读者必须确定你为什么写了一个子查询,而不是简单地写一个Join。是否有性能原因?结果有理由吗?

在功能上,这两个查询可以根据数据产生不同的结果。假设我们有以下几点:

Create Table S (Id int null) 
Create Table R (Id int null) 

insert S Values(1) 
insert S Values(1) 
insert S Values(2) 

insert R Values(1) 
insert R Values(2) 
insert R Values(3) 

Select * From @R As R, @S As S Where R.Id = S.Id 

这导致1,1,2

Select * From @R As R Where R.Id In(Select S.Id From @S As S) 

这导致1,2

第二个查询会产生来自R有一个一行或更多 S中的值。第一个查询类似于Inner Join(即使它正在使用交叉连接),它将为R和S中匹配的每一行返回一行。由于S中有两行与R中的一行相匹配,所以我们得到两行的值为1.

+0

+1用于指出替代语法。有太多人将他们的加入标准与他们的选择标准混合在一起(并且不,他们并不总是产生相同的结果)。 – Duncan 2010-04-16 00:03:21