SQL从表中依次通过SELECT子句传递值,并将结果保存到表

时间:2017-02-02 15:45:10

标签: sql sql-server loops select range

我遇到了SQL中的一种情况,我想在本质上循环遍历查询并让它运行多次,同时将SELECT语句的部分值替换为另一个表中的值。下面是一个简化的例子。

表1

+---------+-------+
| Product | Price |
+---------+-------+
| A       | 2     |
+---------+-------+
| B       | 4     |
+---------+-------+
| C       | 6     |
+---------+-------+
| D       | 1     |
+---------+-------+

表2

+--------+
| Volume |
+--------+
| 1      |
+--------+
| 2      |
+--------+
| 3      |
+--------+

当前查询起点

SELECT 
     PRODUCT
    ,1 AS 'VOLUME'
    ,PRICE
    ,(PRICE * 1) AS 'REVENUE'
FROM dbo.Table1

我开始使用此查询来提供VOLUME = 1时的信息,但我仍然试图弄清楚如何使'1'成为动态并运行Table2中的所有值

表3中的所需输出

+---------+-------+--------+---------+
| Product | Price | Volume | Revenue |
+---------+-------+--------+---------+
| A       | 2     | 1      | 2       |
+---------+-------+--------+---------+
| B       | 4     | 1      | 4       |
+---------+-------+--------+---------+
| C       | 6     | 1      | 6       |
+---------+-------+--------+---------+
| D       | 1     | 1      | 1       |
+---------+-------+--------+---------+
| A       | 2     | 2      | 4       |
+---------+-------+--------+---------+
| B       | 4     | 2      | 8       |
+---------+-------+--------+---------+
| C       | 6     | 2      | 12      |
+---------+-------+--------+---------+
| D       | 1     | 2      | 2       |
+---------+-------+--------+---------+
| A       | 2     | 3      | 6       |
+---------+-------+--------+---------+
| B       | 4     | 3      | 12      |
+---------+-------+--------+---------+
| C       | 6     | 3      | 18      |
+---------+-------+--------+---------+
| D       | 1     | 3      | 3       |
+---------+-------+--------+---------+

我正在使用Microsoft SQL Server 2014

2 个答案:

答案 0 :(得分:3)

交叉加入

 Select t1.product, t1.price, t2.volume, 
     t2.volume * t1.price revenue
 from table1 t1 cross join table2 t2

测试它

declare @t1 table (product char(1), price int)
declare @t2 table (volume int)
insert @t1(product, price)
values ('A', 2), ('B', 4),('C', 6),('D', 1)
insert @t2(volume) values (1), (2), (3)

Select t1.product, t1.price, t2.volume, 
     t2.volume * t1.price revenue
 from @t1 t1 cross join @t2 t2

答案 1 :(得分:2)

如果您需要批量运行计算,那么您可能想要使用循环:

DECLARE @i INT=
(
    SELECT MIN(Volume)
    FROM dbo.Table2
);

WHILE @i IS NOT NULL
BEGIN

    SELECT t1.PRODUCT,
            t1.PRICE,
            t2.Volume,
            (t1.PRICE * t2.Volume) AS Revenue
    FROM dbo.Table1 t1
            INNER JOIN dbo.Table2 t2
                ON t2.Volume BETWEEN @i AND @i + 10;


    SET @i =
    (
        SELECT MIN(Volume)
        FROM dbo.Table2
        WHERE Volume > @i + 10
    );
END;