请查看以下声明。
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;
在这里,我使用了两个用户定义变量@InsuranceFee
和@SubmitFee
。正如您所看到的,您可以通过从@InsuranceFee
中减去一个值来获得@SubmitFee
。
现在,为了使这个工作正常,@InsuranceFee
"必须"首先进行评估。然而,MySQL文档如下所述:
通常情况下,除了在SET语句中之外,不应在同一语句中将值赋给用户变量并读取该值。例如,要递增一个变量,可以这样做:
SET @a = @a + 1; 对于其他语句,比如SELECT,你可能会得到你期望的结果,但这并不是保证的。在下面的语句中,你可能认为MySQL会首先计算@a,然后进行第二次赋值:
SELECT @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
(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))
这样的东西。这是我的真实查询内容... - PeakGenPortfolio
表执行两个查询。@sgeddes提出的解决方案可以在单个子查询中获取两个值,并避免使用9.4用户定义变量,正如您在以下SQL Fiddle中所看到的那样。 - wchiquito