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 子句从表中顺序传递值并将结果保存到表中的主要内容,如果未能解决你的问题,请参考以下文章

如何从表中选择带有 oracle sql 中的 group by 子句的嵌套 json 对象?

select子查询

在sql语句中,ORDERBY子句的功能是()

SQL WHERE 子句

SQL WHERE 子句

SQL WHERE 子句