FROM子句 - SQL中子查询结束时随机字母的重要性

时间:2017-10-18 13:30:09

标签: sql sql-server

我终于成功地总结了两个sql sum查询的结果。这个家伙的一小步:)

我的问题与代码中的最后一个字符(Z)有关:

SELECT SUM(hr)
FROM   (SELECT SUM(amount) AS hr
        FROM   Try_again.dbo.tuesday_practice_database
        WHERE  account_name LIKE 'concessions'
        UNION
        SELECT SUM(amount) AS hr
        FROM   Try_again.dbo.tuesday_practice_database
        WHERE  account_name LIKE 'salaries')Z 

除非在右括号后面有某些内容,否则代码将无效。

我只是好奇为什么会这样,为什么需要跟随一个角色。

似乎角色是什么并不重要,代码会起作用。但如果我把它留空,代码就会中断。

谢谢

2 个答案:

答案 0 :(得分:3)

SELECT sum(hr) 
FROM
(
   Select sum(amount) as hr 
   from Try_again.dbo.tuesday_practice_database 
   where account_name like 'concessions'
   union 
   Select sum(amount) as hr 
   from Try_again.dbo.tuesday_practice_database 
   where account_name like 'salaries'
) z

要更好地理解,请查看以上版本的查询。它是相同的代码,只是重新格式化以帮助说明正在发生的事情。如果您注意到,父FROM子句将从子查询中检索数据。在此上下文中,SQL要求子查询具有某种名称,因此将z添加为别名以满足该要求。你可以在那里放任何你想要的东西,但由于这个名字对我们来说并不重要,所以单个字母的占位符很好。

就像下面的查询一样:

select * from table1 as z

顺便说一下,你没有在LIKE条款中使用通配符!我想你应该重新编写如下的查询:

select sum(hr) from 
(
   Select sum(amount) as hr from Try_again.dbo.tuesday_practice_database 
   where account_name like '%concessions&'
   union all
   Select sum(amount) as hr from Try_again.dbo.tuesday_practice_database 
   where account_name like '%salaries%'
) AS z

如果您不想使用通配符,则应避免使用LIKE使用IN代替并重写这个简单的:

Select sum(amount) from Try_again.dbo.tuesday_practice_database 
where account_name in('concessions', 'salaries')

答案 1 :(得分:2)

这样做:

SELECT SUM(amount) as hr
FROM Try_again.dbo.tuesday_practice_database
WHERE account_name IN ('concessions', 'salaries')

现有代码有一个错误,如果它们的数量相同,它将合并你的两个SUM()。您也可以使用UNION ALL而非UNION来解决此问题,但由于LIKE条件没有任何占位符,例如%_,我们可以做更好地将整个事情简化为一个IN()条件,不需要任何子查询。

现在,如果您希望在匹配中允许更多差异(即LIKE '%concessions%'LIKE '%salaries%'),那么UNION ALL会更有帮助...只需要警告前导{{ 1}} %条件下的占位符非常糟糕以提高性能,应尽可能避免使用。这通常意味着以某种方式更改架构,例如添加一个名为LIKE的表格,将每个帐户分组到一个特定的类别中,您可以在查询中准确定位。

但所有这一切都是在解决实际问题:AccountCategories字符是什么?

在这种情况下,它是别名。您正在使用子查询将两个较小的查询合并在一起。在某些上下文中,SQL语言要求子查询具有名称。这包括使用子查询(派生表)作为zFROMJOIN表达式的目标。您可以使用任何您想要的名称 - 它与查询的功能无关,因为它永远不会再次引用 - 因此一个简单的单字母占位符(如APPLY)就足够了。