【发布时间】:2015-01-27 12:06:52
【问题描述】:
请看下面的声明
INSERT INTO Ongoing_Fees (currentDate, Gross_Fee, Insurance_Fee, Submit_Fee)
SELECT current_timestamp, New.Gross_Fee,
@InsuranceFee := (New.Gross_Fee)*(p.E_Fee/100),
@SubmitFee := @InsuranceFee-(p.s_Fee/100)
FROM Portfolio p
WHERE p.idPortfolio = New.idPortfolio;
这里我使用了 2 个用户定义变量,@InsuranceFee 和 @SubmitFee。如您所见,您可以通过从@InsuranceFee 中减去一个值来获得@SubmitFee。
现在,为了使其工作,@InsuranceFee“必须”首先被评估。但是MySQL document 在下面说
作为一般规则,除了在 SET 语句中,您不应该 为用户变量赋值并读取相同的值 陈述。例如,要增加一个变量,这是可以的:
SET @a = @a + 1;对于其他语句,例如 SELECT,您可能会得到 您期望的结果,但这不能保证。在下面的 语句,你可能会认为 MySQL 会先评估 @a 然后 第二次做作业:
选择@a, @a:=@a+1, ...;但是,评估顺序为 涉及用户变量的表达式未定义。
那么,在SELECT 中使用变量的最佳方式是什么?
更新
可能首先使用单独的 SELECT 语句将值分配给变量更好?像下面这样...
SET @InsuranceFee := New.Gross_Fee * ((SELECT E_Fee FROM Portfolio WHERE idPortfolio = New.idPortfolio)/100);
SET @SubmitFee := @InsuranceFee - ((SELECT s_FeeFROM Portfolio WHERE idPortfolio = New.idPortfolio)/100)
INSERT INTO Ongoing_Fees (currentDate, Gross_Fee, Insurance_Fee, Submit_Fee)
current_timestamp, New.Gross_Fee,
@InsuranceFee ,
@SubmitFee
【问题讨论】:
-
在这种情况下使用9.4 User-Defined Variables 是不安全的,我会寻找新的选项(也许使用13.6.6 Cursors)来达到目标。
-
为什么在这种情况下需要使用
user-defined variables?只需使用(New.Gross_Fee)*(p.E_Fee/100)-(p.s_Fee/100) -
@sgeddes:你愿意使用
((New.Gross_Fee)*(p.E_Fee/100))-((((New.Gross_Fee)*(p.E_Fee/100))*(p.I_Fee/100))+(((New.Gross_Fee)*(p.E_Fee/100)-(((Gross_Fee)*(p.E_Fee/100))*(p.I_Fee/100)))*0.2))之类的东西吗?这是我真正的查询内容.. -
@wchiquito:请检查我的更新。
-
正如您在下面的SQL Fiddle 中看到的那样,您的选择是完全有效的,但是,您的选择必须对
Portfolio表进行两次查询。 @sgeddes 提出的解决方案在单个子查询中获取两个值并避免使用9.4 User-Defined Variables,如下面的SQL Fiddle 所示。
标签: mysql sql database variables select