我正在编写一个包含SQL的存储过程。在某些列上使用某些函数和GROUP BY子句进行查询。 显然,我必须在GROUP BY中重复这些功能,这会大大降低代码的可读性并增加冗余。
到目前为止,我发现的另一种方法是使用派生查询,这样我就可以从“顶级”查询中访问“二级”查询中定义的别名。 我对此解决方法感到非常满意,因为它增加了代码复杂性(和缩进),我觉得当我可以使用单个数据返回所需的所有数据时,我不应该使用两个查询。
我已经google了一下,我发现这个页面返回了关于子查询的相同提示(+一个关于创建一个视图,但在大多数情况下这是过度的)。
我无法真正相信,在2010年,没有其他办法,特别是所有关注代码可重用性和可读性已经持续了多年:任何人都会有一个我从未听说过的优雅提示(对于SQL Server 2005/2008),或者有一个有根据的猜测,为什么在2010年仍然应该这样做?
感谢。
匿名。
答案 0 :(得分:2)
您可以使用CTE
(可以嵌套并重复使用):
WITH sub AS
(
SELECT *, LastName + ', ' + FirstName AS FullName
FROM Employees
),
moresub AS
(
SELECT *, Title + ' ' + FullName AS TitledName
FROM sub
)
SELECT FullName
FROM moresub
WHERE moresub.TitledName = 'Mr. Bertrand, Aaron'
UNION ALL
SELECT FullName
FROM moresub
WHERE moresub.FullName = 'Doe, John'
<强>更新强>
似乎我误解了你的问题。
在MySQL
中,您可以使用SELECT
,ORDER BY
和GROUP BY
条款中的HAVING
列表别名:
SELECT id + 1 AS myalias
FROM (
SELECT 1 AS id
UNION ALL
SELECT 2 AS id
) q
GROUP BY
myalias
HAVING myalias <= 3
ORDER BY
myalias DESC
,但MySQL
因嵌套查询处理不当而闻名,因此这种能力对性能至关重要。
很可能其他系统(处理嵌套查询和CTE
非常好)只是决定他们有更重要的事情需要实现。