如何基于其他行插入行?

时间:2019-08-19 18:09:09

标签: sql-server

我需要运行一个查询,该查询会将INSERT个新行插入到SQL Server join表中。

假设我有下表来描述商店出售哪些产品以及在哪些州使用

products

+------------+--------------+
| product_id | product_name |
+------------+--------------+
|          1 | Laptop       |
|          2 | Aspirin      |
|          3 | Mattress     |
+------------+--------------+

stores

+----------+------------+
| store_id | store_name |
+----------+------------+
|        1 | Walmart    |
|        2 | Best Buy   |
|        3 | Sam's Club |
+----------+------------+

products_stores_states

+------------+----------+-------+
| product_id | store_id | state |
+------------+----------+-------+
|          1 |        2 | AL    |
|          1 |        2 | AR    |
|          2 |        2 | AL    |
|          2 |        2 | AR    |
|          3 |        2 | AL    |
|          3 |        2 | AR    |
+------------+----------+-------+

因此,在这里我们看到百思买出售了AL和AR的所有3种产品。

我需要做的是以某种方式在products_stores_states表中插入行,以为其当前销售的所有产品添加可用区。

有了一个小的数据集,我可以逐行手动进行操作:

INSERT INTO products_stores_states (product_id, store_id, state) VALUES
    (1,2,'AZ'),
    (2,2,'AZ'),
    (3,2,'AZ');

由于这是一个很大的数据集,因此实际上不是一个选择。

我将如何为product_id表中已包含的每一个products_stores_states插入一个新的Best Buy状态?

  

奖励::如果可以同时针对多个状态进行查询,那就更好了。

现在,我无法解决这个问题,但是我认为需要一个子查询来获取我需要使用的匹配product_id值的列表。

2 个答案:

答案 0 :(得分:1)

如果肯定的话,表的插入状态为“ NEW”,则可以将状态变量更改为要插入新记录的状态。

DECLARE @State CHAR(2), @StoreId INT;
SET @State = 'AZ';
SET @StoreId = 2;

INSERT INTO products_stores_states (product_id, store_id, state)
SELECT DISTINCT product_id, @StoreId, @State
FROM dbo.products_stores_states
WHERE store_id = @StoreId;

您首先可以使用以下命令查看此语句的内容:

DECLARE @State CHAR(2)
SET @State = 'AZ';
SET @StoreId = 2;

SELECT DISTINCT product_id, @StoreId, @State
FROM dbo.products_stores_states
WHERE store_id = @StoreId;

答案 1 :(得分:0)

以下查询将完成您想做的事情

DECLARE @temp TABLE (
 state VARCHAR(20)
)

-- we are inserting state names into a temp table to use it further 
INSERT INTO @temp (state)
VALUES
('AZ'),
('MA'),
('TX');

INSERT INTO products_stores_states(product_id, store_id, state )
SELECT
  T.product_id,
  T.store_id,
  temp.state
FROM(
  SELECT DISTINCT
    Product_id, store_id
  FROM
    products_stores_states
  WHERE store_id = 2 -- the store_id for which you want to make changes
) AS T
CROSS JOIN
 @temp AS temp

首先,我们将状态名称存储到表变量中。然后,我们只需要为特定商店选择不同 store_idproduct_id组合。

然后,我们应该在存储状态名称的表变量中插入不同的值cross join

Here是现场演示。

希望,这会有所帮助!谢谢。