我正在开发一个执行SQL select语句以获取报告数据的平台。
我需要编写一个查询,返回表A
的所有列,加上一些计算列。
计算列是与表B
中的单列相乘,对不同的B
行重复几次,用常数标识,即
SELECT
A.Column1,
A.Column2,
A.Column1 * B1.Rate as Column1_Rate1,
A.Column2 * B1.Rate as Column2_Rate1,
A.Column1 * B2.Rate as Column1_Rate2,
A.Column2 * B2.Rate as Column2_Rate2
FROM TableA A
LEFT JOIN TabelB B1 on B1.ID = 'ID1'
LEFT JOIN TabelB B2 on B2.ID = 'ID2'
我的问题是-写这样一个查询的最佳方式是什么,考虑到:
我正在使用MSSQL 2019。
我不能使用存储过程(如果可以,我会将速率查找移到单独的语句中,我认为这将是最优的)。
该查询将成为另一个select语句的子查询,该语句将只从中选择列的子集,例如
SELECT Column1, Column1_Rate1 FROM (^ABOVE QUERY^)
我可以建议下一个方法:由于汇率表没有链接到数据表,您可以通过一个查询获取汇率,然后使用交叉连接:
SELECT
A.Column1,
A.Column2,
A.Column1 * Rate1 as Column1_Rate1,
A.Column2 * Rate1 as Column2_Rate1,
A.Column1 * Rate2 as Column1_Rate2,
A.Column2 * Rate2 as Column2_Rate2
FROM TableA A
CROSS JOIN (
SELECT
MIN(CASE WHEN ID = 'ID1' THEN Rate END) Rate1,
MIN(CASE WHEN ID = 'ID2' THEN Rate END) Rate2
FROM TableB WHERE ID IN ('ID1', 'ID2')
) Rates
在线测试MS SQL 2019查询
或使用CTE:
WITH Rates AS (
SELECT
MIN(CASE WHEN ID = 'ID1' THEN Rate END) Rate1,
MIN(CASE WHEN ID = 'ID2' THEN Rate END) Rate2
FROM TableB WHERE ID IN ('ID1', 'ID2')
) SELECT
A.Column1,
A.Column2,
A.Column1 * Rate1 as Column1_Rate1,
A.Column2 * Rate1 as Column2_Rate1,
A.Column1 * Rate2 as Column1_Rate2,
A.Column2 * Rate2 as Column2_Rate2
FROM Rates, TableA A;