如何在sql server中使用子查询

时间:2014-10-16 12:44:53

标签: sql sql-server

查询

 select * from tbl_emp 
    where emp_salary=(
       select  top 1 emp_salary from 
       (
          select  distinct top 3 emp_salary 
          from tbl_emp 
          order by emp_salary desc
        )
    )a
    order by emp_salary 
    or emp_salary=
    (select * from tbl_emp)

错误

Msg 102, Level 15, State 1, Line 3
Incorrect syntax near ')'.

2 个答案:

答案 0 :(得分:0)

您在这里混合了whereorder by

where .....some conditions....
order by emp_salary or emp_salary=
(select * from tbl_emp)

修改您的查询并找到order by

的适当位置

答案 1 :(得分:0)

布置查询使其更具可读性(缩进是你的朋友!)

有两个问题。首先,由于a括号位于错误的位置,您使用)命名了错误的子查询。其次,我删除了ORDER BY,因为我不确定为什么需要它并且导致错误。

select *
from tbl_emp 
where emp_salary = (select  top 1 emp_salary 
                    from  (select  distinct top 3 emp_salary
                           from tbl_emp 
                           order by emp_salary desc) a)
--order by emp_salary 
or emp_salary=(select * from tbl_emp)

现在重构查询。首先,您可以看到不需要内部子查询

select *
from tbl_emp 
where emp_salary = (select top 1 emp_salary 
                    from tbl_emp 
                    order by emp_salary desc)
--order by emp_salary 
or emp_salary=(select * from tbl_emp)

最后值得指出的是,最后一部分(OR子句)仅在tbl_emp完全有1列并且只有1行时才有效,换句话说,它必须返回单个值,否则你将得到以下错误之一:


  

子查询返回的值超过1。当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。


  

当EXISTS没有引入子查询时,只能在选择列表中指定一个表达式。

相关问题