SQL 通过 SELECT 子句从表中顺序传递值并将结果保存到表中
Posted
技术标签:
【中文标题】SQL 通过 SELECT 子句从表中顺序传递值并将结果保存到表中【英文标题】:SQL pass values from table sequentially through SELECT clause and save results to table 【发布时间】:2017-02-02 15:45:10 【问题描述】:我在 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 中的所有值运行
Table3 中的所需输出
+---------+-------+--------+---------+
| 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
【问题讨论】:
【参考方案1】:交叉连接
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
【讨论】:
谢谢!这提供了所需的结果集。您是否知道为表 2 中的每条记录单独运行查询的替代方法?现实生活中的例子更复杂,我会担心 CROSS JOIN 能否成功运行。 第一个问题是你想做什么?您需要所有组合的结果,还是只需要表 2 中一卷的结果?如果是前者,则必须从磁盘读取两个表中的所有数据。许多查询(除非有适当的索引)必须这样做)。但是,如果您真的只需要一个卷中的组合,请将交叉连接更改为具有On
条件的普通连接,或者添加一个 where 子句,将 SQL 语句限制为您希望它处理的 table2 中的任何记录.【参考方案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;
【讨论】:
谢谢!这提供了所需的结果集。您是否知道为表 2 中的每条记录单独运行查询的替代方法?现实生活中的例子更复杂,我会担心 CROSS JOIN 能否成功运行。以上是关于SQL 通过 SELECT 子句从表中顺序传递值并将结果保存到表中的主要内容,如果未能解决你的问题,请参考以下文章