【问题标题】:SQL - Copy multiple rows for each row from another querySQL - 从另一个查询中为每一行复制多行
【发布时间】:2021-03-04 00:03:45
【问题描述】:

我似乎有一个相对简单的任务要做,但是我的 SQL 知识有限,我的 google fu 对我来说失败了。尽管我可以通过编写 powershell 脚本或使用 notepad++ 来解决它,但我对如何使用 SQL 实现这一点非常感兴趣,特别是如果表变得非常大并且解决方法不是很可行没有了。

简单来说,我有两张表:

价格

Productname Customer_ID price1 price2 price3 price4
A 1 10 11 12 13
B 1 99 100 101 102
C 1 48 49 50 51
D 1 2 3 4 5
E 1 89 90 91 92

客户

Name ID Customer_Group
B 2 ABC
C 3 ABC
D 4 ABC
E 5 ABC
F 6 ABC

现在我想将 Customer_ID = 1 的价格表中的 5 行复制(即插入)回 Customer_Group = ABC 的客户表中每个客户的价格表。每次复制这5行时,我还需要将字段Customer_ID设置为customers表查询返回的ID。

所以价格表如下所示:

Productname Customer_ID price1 price2 price3 price4
A 1 10 11 12 13
B 1 99 100 101 102
C 1 48 49 50 51
D 1 2 3 4 5
E 1 89 90 91 92
A 2 10 11 12 13
B 2 99 100 101 102
C 2 48 49 50 51
D 2 2 3 4 5
E 2 89 90 91 92
A 3 10 11 12 13
B 3 99 100 101 102
C 3 48 49 50 51
D 3 2 3 4 5
E 3 89 90 91 92

(等等)

【问题讨论】:

  • 到目前为止您尝试过什么?你的表结构是什么?如果没有实际的表结构(带有数据类型/等),我们无法给出最佳查询。
  • 客户 ID 2 和 3 的值来自哪里?它们不在您的示例数据中,只有客户 1 是。
  • @Larnu,客户 ID 2、3 等的值需要从客户 1 复制。

标签: sql sql-server


【解决方案1】:
 SELECT *
 FROM CUSTOMERS            
 WHERE CUSTOMERS.NAME IN ('B','C','D','E','F') 
       -- may not be needed if you want all rows from customers table.

将选择您想要合作的所有客户

现在我们只需加入另一个表以获取数据

 SELECT *
 FROM CUSTOMERS
 JOIN PRICES ON  PRICES.Customer_ID = 1
 WHERE CUSTOMERS.Customer_Group = 'ABC'

选择您需要的列

 SELECT PRICES.ProductName, 
        CUSTOMERS.CustomerID,
        PRICES.price1, PRICES.price2, PRICES.price3, PRICES.price4
 FROM CUSTOMERS
 JOIN PRICES ON  PRICES.Customer_ID = 1
 WHERE CUSTOMERS.Customer_Group = 'ABC'

如果你想将它插入到表中,请在开头添加插入语句

 INSERT INTO PRICES 
      (Productname, Customer_ID, price1, price2, price3, price4, price5)
   SELECT PRICES.ProductName, 
          CUSTOMERS.CustomerID,
          PRICES.price1, PRICES.price2, PRICES.price3, PRICES.price4
   FROM CUSTOMERS
   JOIN PRICES ON  PRICES.Customer_ID = 1
   WHERE CUSTOMERS.Customer_Group = 'ABC'

【讨论】:

  • 您的帖子让我找到了答案,所以如果您可以编辑您提出的解决方案以包括基于 Customer_Group 的插入开始和客户选择,我可以接受您的回答作为解决方案。 INSERT INTO PRICES (Productname, Customer_ID, price1, price2, price3, price4, price5) SELECT PRICES.ProductName, CUSTOMERS.CustomerID, PRICES.price1, PRICES.price2, PRICES.price3, PRICES.price4, PRICES.price5 FROM CUSTOMERS JOIN PRICES ON PRICES.Customer_ID = 1 WHERE CUSTOMERS.Customer_Group = 'ABC'
  • 确定@VolrathTheFallen -- 我做了更改。
【解决方案2】:

总之,这是?

SELECT P.ProductName,
       P.Customer_ID,
       P.price1,
       P.price2, --This is a denormalised design, and you should fix this
       P.price3, --This is a denormalised design, and you should fix this
       P.price4 --This is a denormalised design, and you should fix this
FROM dbo.Prices P
--WHERE P.Customer = 1 --?
UNION ALL
SELECT P.ProductName,
       C.ID AS CustomerID,
       P.price1,
       P.price2, --This is a denormalised design, and you should fix this
       P.price3, --This is a denormalised design, and you should fix this
       P.price4 --This is a denormalised design, and you should fix this
FROM dbo.Prices P
     CROSS JOIN dbo.Customers C;
--WHERE P.Customer = 1 --?

【讨论】:

  • 如果customers 表中的不仅仅是customer_id == 1 的用户怎么办?
  • 然后它会交叉加入他们所有人,@Hogan。 OP 可以很容易地自己添加WHERE。我只能根据他们提供的样本数据来回答。
  • 这是我的观点,它在示例数据和描述中。 “现在我想从 Customer_ID = 1 的价格表中复制 5 行”
  • 在他们的样本@Hogan 中,Prices 表中只有 1 位客户。他们甚至没有提到他们想为其他客户做什么,所以我什至不想开始猜测。如果 OP 确实想让我们猜测我们应该对这些其他客户做什么,那么我会投票决定关闭。
  • 我只是把报价单放在上面?这不是您所说的未指定的人的引述吗?
猜你喜欢
  • 1970-01-01
  • 2017-08-21
  • 1970-01-01
  • 2021-12-25
  • 2021-12-28
  • 2012-04-24
  • 2013-01-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多