我无法弄清楚这些查询之间的区别。我很确定第一个是equi-join。我不确定第二个与第一个不一样。 #2中的子查询从S中选择所有ID,然后返回所有具有这些ID的R,不是吗?
SELECT R.cname 从R,S, 在哪里R.Id = S.Id
SELECT R.cname 来自R. 在哪里R.Id IN(从S.选择S.Id)
修改:
我从过去的考试中抓住了这个....我引述:
虽然查询似乎产生相同的答案,但他们没有。他们是怎么做的
不同?您可以给出显示R和S的示例实例
这两个查询可以产生不同的答案
R(Id,TourId,cname,caddress,cost)
S(Id,SpecId)
编辑:编辑:
我猜它与重复有关。
答案 0 :(得分:2)
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中有一个或更多值。第一个查询类似于内部联接(即使它使用交叉联接)将返回R和S中每一行匹配的行。由于S中有两行与R中的一行匹配,因此我们得到值为1的两行。
答案 1 :(得分:1)
从应用程序开发人员的角度来看,如果表之间具有良好定义的关系(特别是对于连接查询),则子查询和连接查询都可以为您工作。但通常情况下,equi连接(或DB作为equi连接处理的交叉连接)可以更快,因为DB可以优化连接查询。但是在子查询的情况下,DB必须独立运行两个查询,因此您可能会看到性能稍慢。话虽这么说,如果故事有太多数据,加入可能会很慢,而子查询在这种情况下可能会起作用。一般的经验法则是尽可能使用join。如果你看到一些问题尝试子查询。
答案 2 :(得分: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
返回一次记录。