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)
长话短说:
您需要通过测试来验证,但使用索引,您的解决方案可能是最干净、最有效的。感谢您的详细解释:)