SQL Server查询:SELECT 1 WHERE EXISTS与SELECT TOP 1 1

Min*_*iMe 3 sql t-sql sql-server sql-server-2005 query-optimization

我需要提供一个标志 - 如果条件不满足则为0,如果是,则为1 - 我可以以两种不同的方式进行:

获取员工ID,名称,如果其他人在子订单中,则为1 - 否则为0:

SELECT e.ID
     , e.Name
     , ISNULL ( ( SELECT TOP 1 1 FROM Employee se WHERE se.ManagerID = e.ID ) , 0 ) AS HasSubordinates 
  FROM Employee e
Run Code Online (Sandbox Code Playgroud)

要么

SELECT e.ID
     , e.Name
     , ISNULL ( ( SELECT 1 WHERE EXISTS ( SELECT * FROM Employee se WHERE se.ManagerID = e.ID ) ) , 0 ) AS HasSubordinates 
  FROM Employee e
Run Code Online (Sandbox Code Playgroud)

你会选择哪个版本?为什么?


更新1


这个怎么样 ?

SELECT o.ID
     , o.Name
     , o.StartDate
     , o.EndDate
     , ISNULL ( ( SELECT TOP 1 1 FROM changes c WHERE c.ChangeDate BETWEEN o.StartDate AND o.EndDate ) , 0 ) AS IsChanged
  FROM Orders o
Run Code Online (Sandbox Code Playgroud)

要么

SELECT o.ID
     , o.Name
     , o.StartDate
     , o.EndDate
     , ISNULL ( ( SELECT 1 WHERE EXISTS ( SELECT * FROM changes c WHERE c.ChangeDate BETWEEN o.StartDate AND o.EndDate ) ), 0 ) AS IsChanged
  FROM Orders o
Run Code Online (Sandbox Code Playgroud)

OMG*_*ies 8

我也没用过:

   SELECT t.id,
          t.name,
          CASE WHEN x.managerid IS NULL THEN 0 ELSE 1 END AS HasSubordinates 
     FROM EMPLOYEE t
LEFT JOIN (SELECT DISTINCT 
                  e.managerid
             FROM EMPLOYEE e) x ON x.managerid = t.id
Run Code Online (Sandbox Code Playgroud)

...因为SELECT子句中的相关SELECTS 是坏的 - 它们不会缩放,因为它们对返回的每一行都执行.这意味着您拥有的行越多,调用相关SELECT的次数就越多.