Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL列出最小和最大的孩子_Sql - Fatal编程技术网

SQL列出最小和最大的孩子

SQL列出最小和最大的孩子,sql,Sql,是否有更好的方法列出孩子的年龄(新的函数列)并输出两个结果,即最小和最大的孩子 我试过: SELECT Name, DOB, DATEDIFF(YEAR, DOB, GETDATE()) AS Age FROM Children WHERE DOB = (SELECT MIN(DOB) FROM Children) OR DOB = (SELECT MAX(DOB) FROM Children) 它似乎在工作,但我不确定这是正确的方法还是有更好的方法?这里有两个子查询,可能需要分别传递每个子查

是否有更好的方法列出孩子的年龄(新的函数列)并输出两个结果,即最小和最大的孩子

我试过:

SELECT Name, DOB,
DATEDIFF(YEAR, DOB, GETDATE()) AS Age
FROM Children
WHERE DOB = (SELECT MIN(DOB) FROM Children) OR
DOB = (SELECT MAX(DOB) FROM Children)

它似乎在工作,但我不确定这是正确的方法还是有更好的方法?

这里有两个子查询,可能需要分别传递每个子查询的数据(尽管索引可能会有所帮助)。您还可以执行以下操作:

SELECT Name, DOB, DATEDIFF(YEAR, DOB, GETDATE()) AS Age
FROM Children c JOIN
     (SELECT MIN(DOB) as mindob, MAX(DOB) as MAX(dob)
      FROM Children
     ) cm
     ON c.DOB = mindob or c.DOB = maxdob;

这是一次通过数据的计算。

我需要看一些执行计划;但是逻辑上,由于or,where子句必须在每一行上执行一次,而不是两次。因此,数据集越大,您可能需要的时间就越长。然而,如果你有一个关于DOB的指数,我不确定你的指数可以如何改进。 所以我们想看看有可能替换OR的方法,或者以某种方式消除where的逐行求值

所以。。如果DOB上存在索引。。。你可能会从你已经拥有的东西中获得惊人的表现

但是如果不存在索引。。。需要考虑的其他选择:

将联接与或一起使用,我认为联接将增加太多的开销,尽管这样做很有价值,尤其是与或一起使用

SELECT Name, DOB, DATEDIFF(YEAR, DOB, GETDATE()) AS Age
FROM Children
INNER JOIN (SELECT min(DOB) y, Max(DOB) z FROM children) a
 on a.y=dob 
 or a.z=dob
如果您的RDBMS支持CTE。。。但欧盟、cte和联合抵销是否抵消了where条款和/或的成本?优点是对CTE进行一次选择,我们消除了or

with CTE as (SELECT min(DOB) y FROM children UNION Select Max(DOB) z FROM children)
SELECT Name, DOB, DATEDIFF(YEAR, DOB, GETDATE()) AS Age
FROM Children
INNER JOIN CTE 
 on CTE.y = DOB
或者,如果您没有CTE,则使用子查询。这消除了OR。。但会导致在每行上发生子选择

    SELECT Name, DOB, DATEDIFF(YEAR, DOB, GETDATE()) AS Age
    FROM Children
    WHERE DOB in (SELECT min(DOB) y FROM children UNION Select Max(DOB) z FROM children)
或者可能使用exists-避免了速度较慢的或,但添加了增加时间的子查询。不确定消除OR的好处是否被联合和子选择抵消

SELECT Name, DOB, DATEDIFF(YEAR, DOB, GETDATE()) AS Age
FROM Children 
where exists (SELECT 1 FROM 
               (SELECT min(DOB) y FROM children UNION 
                SELECT Max(DOB) y FROM children) B 
              on B.Y = Children.DOB)
长话短说:


您需要通过测试来验证,但使用索引,您的解决方案可能是最干净、最有效的。

感谢您的详细解释:)