毫无疑问是主查询先。例如select * from A WHERE id < 5AND ID IN (SELECT ID FROM B WHERE xxxx)这里由于是and连接,不存在优先级问题。所以查询的时候先全表扫描 id < 5的,然后再多一个条件,id in 子查询。此时,先去查询子查询。然后再回到主查询。从这个例子可以看出每次扫描都要做子查询扫描,从而导致了效率低下。这也是为什么不推荐子查询的根本原因。
说不上来子查询与主查询,看语句了,看了前面几条的回答我有些疑问,按我的理解来说,是where 先处理的,再 select 你说的子主我还真整不明白对于where a=1 and b=1 是按a,b的顺序进行。,本着认真的态度,我用mssql做了测试,oracle应该一样的吧。我的方法简单,就是让子查询用函数处理,因为函数中不能用update之类的,所以我变通的将数据用cmdshell写入到磁盘文件a.txt里,用来看顺序就用select a from tb b in (c)来说明我的代码如下--打开 cmdshellEXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 1;RECONFIGURE;goCREATE FUNCTION [dbo].[fx]( @n int )RETURNS intASBEGIN declare @cmd nvarchar(4000) set @cmd =' echo '+ convert(nvarchar(10),@n) +' >> c:\a.txt ' exec xp_cmdshell @cmd,no_output RETURN @nENDgodeclare @tb table ( [id] [int] IDENTITY(1,1) NOT NULL, [n] [int] NOT NULL)insert @tb (n) values(1)select dbo.fx(n) from @tb where dbo.fx(2) in( dbo.fx(3) )godrop function dbo.fxgo--关闭权限EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 0;RECONFIGURE;go/*-------------结果----------2 3 ---------------------------*/也就是select dbo.fx(1) from @tb where dbo.fx(2) in( dbo.fx(3) )where 选处理2再处理3再处理1的改成 select dbo.fx(1) from @tb where dbo.fx(2) in( dbo.fx(3) ,2)的结果是 2,1 说明3没有处理,我用的sql2008,可能先进一些,找到2了就不处理了。不知道低版本的处不处理3.希望大家一起探讨。