请谈谈各位的SQL使用经验:是联结快还是嵌套查询快?

时间:2022-10-25 22:34:22
当然,前提是要保证结果的正确性!
如:
表一
Create Table t1
(
PrimaryKey int IDENTITY(1,1) NOT NULL,
left       int,
right      int,
top        int,
bottom     int
)
表二
Create Table t2
(
PrimaryKey   int IDENTITY(1,1) NOT NULL,
ParentKey    int,
X      int,
Y            int
)
t1.PrimaryKey = t2.ParentKey

要选出t1的所有字段和t2除ParentKey 之外的字段,并按t1.PrimaryKey,t2.PrimaryKey 排序.

27 个解决方案

#1


条件是:
嵌套:
    WHERE T1.PrimaryKey IN (select T2.ParentKey FROM T2)
联结:
   ON T1.PrimaryKey = T2.ParentKey

#2


select a.*,b.* from a full outer join b on a.primarykey=b.primarykey

嵌套有办法实现你的要求吗?用嵌套可不是容易的事!

#3


To Fan:
嵌套:
Select a.* ,b.[X],b.[Y],b.[PrimaryKey] as PrimaryKey2
From t1 a ,t2 b
WHERE b.[ParentKey] in (Select PrimaryKey From t1)
Order By a.PrimaryKey,PrimaryKey2

还有t1 的 PrimaryKey 对应 t2的ParentKey.
用联结是这样吧:
SELECT t1.*,t2.[X],t2.[Y],t2.[PrimaryKey] as PrimaryKey2
From t1 Inner Join t2
Order By t1.PrimaryKey,PrimaryKey2

#4


你的
Select a.* ,b.[X],b.[Y],b.[PrimaryKey] as PrimaryKey2
From t1 a ,t2 b
WHERE b.[ParentKey] in (Select PrimaryKey From t1)
Order By a.PrimaryKey,PrimaryKey2

和:
Select a.* ,b.[X],b.[Y],b.[PrimaryKey] as PrimaryKey2
From t1 a ,t2 b
WHERE b.[ParentKey] b.PrimaryKey
Order By a.PrimaryKey,PrimaryKey2
有什么区别?为什么要用(Select PrimaryKey From t1)子句呢?


#5


上面的where子句中缺个=
WHERE b.[ParentKey] = b.PrimaryKey

#6


sorry 写错了
嵌套:
Select a.* ,b.[X],b.[Y],b.[PrimaryKey] as PrimaryKey2
From t1 a ,t2 b
WHERE b.[ParentKey] in (Select PrimaryKey From t2)
Order By a.PrimaryKey,PrimaryKey2

#7


gz

#8


Select a.* ,b.[X],b.[Y],b.[PrimaryKey] as PrimaryKey2
From t1 a ,t2 b
WHERE b.[ParentKey] in (Select PrimaryKey From t2)
Order By a.PrimaryKey,PrimaryKey2
功能和下面语句一样,
select a.*,b.* from a left outer join b on a.primarykey=b.primarykey
也就是只选出表A中primarykey存在的记录,
如果光针对这两句SQL的话,肯定 是下面的快。

#9


To Fan:
******a.primaryKey对应b.ParentKey****
而且功能不一样,如果T2里有无法与T1对应的纪录就会有NULL值
所以只可以INNER JOIN.

但是为什么JOIN 快于嵌套查询?

#10


请大家踊跃发言!

#11


******a.primaryKey对应b.ParentKey****
而且功能不一样,如果T2里有无法与T1对应的纪录就会有NULL值
所以只可以INNER JOIN.

不明白,

#12


select a.*,b.* from a left outer join b on a.primarykey=b.primarykey
改成
select T1.*,T2.* from a INNER JOIN b on a.primarykey=b.PARENTKEY
才可以保正与嵌套查询的结果一致.

T1,T2只不过是举个例子.主要请大家结合这个例子来比较是JOIN效率高还是嵌套查询效率高

#13


你想比较的是这种情况吧?我觉得一样

select T1.*,T2.* from T1 a INNER JOIN T2 b on a.primarykey=b.PARENTKEY
等价于
select T1.*,T2.* from T1 a T2 b where a.primarykey=b.PARENTKEY

#14


select T1.*,T2.* from T1 a INNER JOIN T2 b on a.primarykey=b.PARENTKEY
等价于
select T1.*,T2.* from T1 a ,T2 b where a.primarykey=b.PARENTKEY

#15


看一下执行计划就知道了,两个应该是一样的

#16


题目有问题!
不具可比性!
agree sky_blue(老衲)

#17


我在一篇文章上看到:

 在关系数据库中,除在数据库的物理设计、关系规范化等方面进行优化外,一个简单直接有效的方法是对SQL语句进行调整,减少计算量和内存需求,提高响应速度。
  b.多个表格的联结选择运算
  联结运算是数据库中常用的运算之一,由于联结运算会产生很大的临时表,特别是数个表格的联结运算,不优化的SQL查询语句会产生巨大的计算量,对于联结选择运算,如果可以由嵌套SQL 语句实现,就采用嵌套SQL 语句形式减少数据量。例如:
  SELECT * 
  FORM Customer ,Address
  Where Customer.Tel=Address.Tel
  And Customer.PayDate=’10-AUG-98’
  可以修改为:
  SELECT * 
  FROM Address
  Where Tel=
  (SELECT Tel FROM Cutomer
  where PayDate=’10=zug-98’)
  对于不能改写的联结选择运算,可以采用调整表的排列循序和选择条件,减少临时表中的列数,优化系统性能。
http://www.powerba.com/develop/database/sqlserver/article/20001019002.htm
以上可能举的例子不太恰当.
但是,我主要是想请各位分析一下是联结快还是嵌套查询快.
请各位举出适当的例子.

#18


我感觉嵌套比联结要慢

#19


gz

#20


当需要频繁的计算聚集数值并将其用在外查询中作比较时,子查询就显出它的优势了,但如果一个查询中的select 列表中的列是来自多于一个表的,那末联接具有优越性

#21


是不是说联结的优势在于多个表的使用?
那样会不会使临时占用相对多的SQL系统资源?

#22


嵌套:

#23


to: pengdali(大力)
为什么?

#24


我觉得关联查询要快一些,但在并发访问很多的情况下,效果不是太理想。

#25


联结

#26


恕我水平有限,也可能你给的例子表述不清或是Mission Impossibility :)

下面是我的三个方案:(Only for SqlServer2000)
1.T-SQL语法的联接写法

SELECT distinct t1.* ,t2.ParentKey
FROM t1,t2
WHERE t1.PrimaryKey = t2.ParentKey
Order by t1.PrimaryKey, t2.ParentKey

2. SQL99标准写法,微软也推荐这种联接写发.
 
SELECT distinct t1.* ,t2.ParentKey
FROM t1
Inner Join t2
ON t1.PrimaryKey = t2.ParentKey
Order by t1.PrimaryKey, t2.ParentKey

3. 子查询(这个子查询我觉的写的很勉强,估计很有问题,不过可以保正结果和上面两个查询一样)

SELECT distinct t1.* ,(select top 1 t2.ParentKey from t2 where t2.ParentKey = t1.PrimaryKey) as ParentKey
FROM t1
WHERE t1.PrimaryKey IN (SELECT t2.ParentKey FROM t2)
Order by t1.PrimaryKey

上面前两个方法在SQL中执行效率计划一摸一样,第三中的话变化就有点大了.至于说性能的话,还实在没能力作出分析!

#27


看来真是题目有问题:) 

如老纳说的,你可能只是想比较两中不同的联接写发,那么结果肯定是一样的.

#1


条件是:
嵌套:
    WHERE T1.PrimaryKey IN (select T2.ParentKey FROM T2)
联结:
   ON T1.PrimaryKey = T2.ParentKey

#2


select a.*,b.* from a full outer join b on a.primarykey=b.primarykey

嵌套有办法实现你的要求吗?用嵌套可不是容易的事!

#3


To Fan:
嵌套:
Select a.* ,b.[X],b.[Y],b.[PrimaryKey] as PrimaryKey2
From t1 a ,t2 b
WHERE b.[ParentKey] in (Select PrimaryKey From t1)
Order By a.PrimaryKey,PrimaryKey2

还有t1 的 PrimaryKey 对应 t2的ParentKey.
用联结是这样吧:
SELECT t1.*,t2.[X],t2.[Y],t2.[PrimaryKey] as PrimaryKey2
From t1 Inner Join t2
Order By t1.PrimaryKey,PrimaryKey2

#4


你的
Select a.* ,b.[X],b.[Y],b.[PrimaryKey] as PrimaryKey2
From t1 a ,t2 b
WHERE b.[ParentKey] in (Select PrimaryKey From t1)
Order By a.PrimaryKey,PrimaryKey2

和:
Select a.* ,b.[X],b.[Y],b.[PrimaryKey] as PrimaryKey2
From t1 a ,t2 b
WHERE b.[ParentKey] b.PrimaryKey
Order By a.PrimaryKey,PrimaryKey2
有什么区别?为什么要用(Select PrimaryKey From t1)子句呢?


#5


上面的where子句中缺个=
WHERE b.[ParentKey] = b.PrimaryKey

#6


sorry 写错了
嵌套:
Select a.* ,b.[X],b.[Y],b.[PrimaryKey] as PrimaryKey2
From t1 a ,t2 b
WHERE b.[ParentKey] in (Select PrimaryKey From t2)
Order By a.PrimaryKey,PrimaryKey2

#7


gz

#8


Select a.* ,b.[X],b.[Y],b.[PrimaryKey] as PrimaryKey2
From t1 a ,t2 b
WHERE b.[ParentKey] in (Select PrimaryKey From t2)
Order By a.PrimaryKey,PrimaryKey2
功能和下面语句一样,
select a.*,b.* from a left outer join b on a.primarykey=b.primarykey
也就是只选出表A中primarykey存在的记录,
如果光针对这两句SQL的话,肯定 是下面的快。

#9


To Fan:
******a.primaryKey对应b.ParentKey****
而且功能不一样,如果T2里有无法与T1对应的纪录就会有NULL值
所以只可以INNER JOIN.

但是为什么JOIN 快于嵌套查询?

#10


请大家踊跃发言!

#11


******a.primaryKey对应b.ParentKey****
而且功能不一样,如果T2里有无法与T1对应的纪录就会有NULL值
所以只可以INNER JOIN.

不明白,

#12


select a.*,b.* from a left outer join b on a.primarykey=b.primarykey
改成
select T1.*,T2.* from a INNER JOIN b on a.primarykey=b.PARENTKEY
才可以保正与嵌套查询的结果一致.

T1,T2只不过是举个例子.主要请大家结合这个例子来比较是JOIN效率高还是嵌套查询效率高

#13


你想比较的是这种情况吧?我觉得一样

select T1.*,T2.* from T1 a INNER JOIN T2 b on a.primarykey=b.PARENTKEY
等价于
select T1.*,T2.* from T1 a T2 b where a.primarykey=b.PARENTKEY

#14


select T1.*,T2.* from T1 a INNER JOIN T2 b on a.primarykey=b.PARENTKEY
等价于
select T1.*,T2.* from T1 a ,T2 b where a.primarykey=b.PARENTKEY

#15


看一下执行计划就知道了,两个应该是一样的

#16


题目有问题!
不具可比性!
agree sky_blue(老衲)

#17


我在一篇文章上看到:

 在关系数据库中,除在数据库的物理设计、关系规范化等方面进行优化外,一个简单直接有效的方法是对SQL语句进行调整,减少计算量和内存需求,提高响应速度。
  b.多个表格的联结选择运算
  联结运算是数据库中常用的运算之一,由于联结运算会产生很大的临时表,特别是数个表格的联结运算,不优化的SQL查询语句会产生巨大的计算量,对于联结选择运算,如果可以由嵌套SQL 语句实现,就采用嵌套SQL 语句形式减少数据量。例如:
  SELECT * 
  FORM Customer ,Address
  Where Customer.Tel=Address.Tel
  And Customer.PayDate=’10-AUG-98’
  可以修改为:
  SELECT * 
  FROM Address
  Where Tel=
  (SELECT Tel FROM Cutomer
  where PayDate=’10=zug-98’)
  对于不能改写的联结选择运算,可以采用调整表的排列循序和选择条件,减少临时表中的列数,优化系统性能。
http://www.powerba.com/develop/database/sqlserver/article/20001019002.htm
以上可能举的例子不太恰当.
但是,我主要是想请各位分析一下是联结快还是嵌套查询快.
请各位举出适当的例子.

#18


我感觉嵌套比联结要慢

#19


gz

#20


当需要频繁的计算聚集数值并将其用在外查询中作比较时,子查询就显出它的优势了,但如果一个查询中的select 列表中的列是来自多于一个表的,那末联接具有优越性

#21


是不是说联结的优势在于多个表的使用?
那样会不会使临时占用相对多的SQL系统资源?

#22


嵌套:

#23


to: pengdali(大力)
为什么?

#24


我觉得关联查询要快一些,但在并发访问很多的情况下,效果不是太理想。

#25


联结

#26


恕我水平有限,也可能你给的例子表述不清或是Mission Impossibility :)

下面是我的三个方案:(Only for SqlServer2000)
1.T-SQL语法的联接写法

SELECT distinct t1.* ,t2.ParentKey
FROM t1,t2
WHERE t1.PrimaryKey = t2.ParentKey
Order by t1.PrimaryKey, t2.ParentKey

2. SQL99标准写法,微软也推荐这种联接写发.
 
SELECT distinct t1.* ,t2.ParentKey
FROM t1
Inner Join t2
ON t1.PrimaryKey = t2.ParentKey
Order by t1.PrimaryKey, t2.ParentKey

3. 子查询(这个子查询我觉的写的很勉强,估计很有问题,不过可以保正结果和上面两个查询一样)

SELECT distinct t1.* ,(select top 1 t2.ParentKey from t2 where t2.ParentKey = t1.PrimaryKey) as ParentKey
FROM t1
WHERE t1.PrimaryKey IN (SELECT t2.ParentKey FROM t2)
Order by t1.PrimaryKey

上面前两个方法在SQL中执行效率计划一摸一样,第三中的话变化就有点大了.至于说性能的话,还实在没能力作出分析!

#27


看来真是题目有问题:) 

如老纳说的,你可能只是想比较两中不同的联接写发,那么结果肯定是一样的.