SQL Server变量值按行(MySQL:=等效)

问题描述 投票:0回答:1

我一直在使用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中尝试了相同的情况但没有成功。我已经阅读了很多关于变量和在线搜索但我没有发现任何可以重现这种情况的东西。

我的问题是:

  1. 这在SQL Server中是否可行,如果可以,如何?
  2. 这种方法是最佳实践还是存在风险?
  3. 这样做有更高效或更好/更安全的方法吗?

我对SQL有很好的理解,但我绝不是专家。提前感谢能够提供一些启示和建议的人。

sql-server variables variable-assignment
1个回答
0
投票

我仍然使用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 :-))

© www.soinside.com 2019 - 2024. All rights reserved.