我一直在使用MySQL一段时间,但我目前正在学习SQL Server及其中的差异。
在MySQL中,我使用了:= Assignment运算符来减少写入的代码量。举个简单的例子:
SELECT
ps.Person_Name,
@Sales := (SELECT COUNT(*) From Sales sl Where sl.Sale_Person = ps.Person_ID) as Person_Sales,
@Target := (SELECT st.Sales_Target From Targets tg Where tg.Target_Person = ps.Person_ID) as Person_Target,
(IF(@Sales < @Target, 'You Suck', 'Well Done')) as Sales_Status
From People ps
这里的想法是我可以替换构成@Sales和@Target的子查询,并使用IF语句中的变量值为每个人生成Sales_Status。
我在SQL Server中尝试了相同的情况但没有成功。我已经阅读了很多关于变量和在线搜索但我没有发现任何可以重现这种情况的东西。
我的问题是:
我对SQL有很好的理解,但我绝不是专家。提前感谢能够提供一些启示和建议的人。
我仍然使用Sales
的子查询,但将其移动到FROM
子句中,并简单地将join
用于目标:
SELECT
ps.Person_Name,
sal.Cnt as Person_Sales,
tg.Sales_Target as Person_Target,
IF(sal.Cnt < tg.Sales_Target, 'You Suck', 'Well Done') as Sales_Status
From People ps
inner join Targets tg
on tg.Target_Person = ps.Person_ID
inner join (select Sale_Person,COUNT(*) as Cnt from Sales group by Sale_Person) sal
on sal.Sale_Person = ps.Person_ID
哪个都是普通的标准SQL所以应该可以跨所有RDBMS移植(甚至回到MySQL :-))