如:
表一
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
嵌套:
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
嵌套:
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)子句呢?
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
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
嵌套:
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的话,肯定 是下面的快。
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 快于嵌套查询?
******a.primaryKey对应b.ParentKey****
而且功能不一样,如果T2里有无法与T1对应的纪录就会有NULL值
所以只可以INNER JOIN.
但是为什么JOIN 快于嵌套查询?
#10
请大家踊跃发言!
#11
******a.primaryKey对应b.ParentKey****
而且功能不一样,如果T2里有无法与T1对应的纪录就会有NULL值
所以只可以INNER JOIN.
不明白,
而且功能不一样,如果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效率高还是嵌套查询效率高
改成
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
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
等价于
select T1.*,T2.* from T1 a ,T2 b where a.primarykey=b.PARENTKEY
#15
看一下执行计划就知道了,两个应该是一样的
#16
题目有问题!
不具可比性!
agree sky_blue(老衲)
不具可比性!
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
以上可能举的例子不太恰当.
但是,我主要是想请各位分析一下是联结快还是嵌套查询快.
请各位举出适当的例子.
在关系数据库中,除在数据库的物理设计、关系规范化等方面进行优化外,一个简单直接有效的方法是对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系统资源?
那样会不会使临时占用相对多的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中执行效率计划一摸一样,第三中的话变化就有点大了.至于说性能的话,还实在没能力作出分析!
下面是我的三个方案:(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
嵌套:
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
嵌套:
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)子句呢?
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
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
嵌套:
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的话,肯定 是下面的快。
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 快于嵌套查询?
******a.primaryKey对应b.ParentKey****
而且功能不一样,如果T2里有无法与T1对应的纪录就会有NULL值
所以只可以INNER JOIN.
但是为什么JOIN 快于嵌套查询?
#10
请大家踊跃发言!
#11
******a.primaryKey对应b.ParentKey****
而且功能不一样,如果T2里有无法与T1对应的纪录就会有NULL值
所以只可以INNER JOIN.
不明白,
而且功能不一样,如果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效率高还是嵌套查询效率高
改成
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
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
等价于
select T1.*,T2.* from T1 a ,T2 b where a.primarykey=b.PARENTKEY
#15
看一下执行计划就知道了,两个应该是一样的
#16
题目有问题!
不具可比性!
agree sky_blue(老衲)
不具可比性!
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
以上可能举的例子不太恰当.
但是,我主要是想请各位分析一下是联结快还是嵌套查询快.
请各位举出适当的例子.
在关系数据库中,除在数据库的物理设计、关系规范化等方面进行优化外,一个简单直接有效的方法是对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系统资源?
那样会不会使临时占用相对多的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中执行效率计划一摸一样,第三中的话变化就有点大了.至于说性能的话,还实在没能力作出分析!
下面是我的三个方案:(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
看来真是题目有问题:)
如老纳说的,你可能只是想比较两中不同的联接写发,那么结果肯定是一样的.
如老纳说的,你可能只是想比较两中不同的联接写发,那么结果肯定是一样的.