【问题标题】:SQL insert/update to a table from another table based on some conditionSQL 根据某些条件从另一个表插入/更新到一个表
【发布时间】:2020-12-24 12:58:44
【问题描述】:

我有一个如下表,名为 table1:

+-----------+-------+
| productid | stock |
+-----------+-------+
|         1 |    10 |
|         2 |    20 |
|         3 |    30 |
+-----------+-------+

我需要从另一个名为 table2 的表中插入/更新到上面的表:

+-----+-------+
| PId | stock |
+-----+-------+
|   1 |    20 |
|   2 |    40 |
|   4 |    10 |
+-----+-------+

我想执行以下条件的 SQL 查询:

  1. 如果 table2 的 PId 存在于 table1 的 Productid 中,则需要更新 stock 的值。
  2. 如果 table2 中的 PId 不存在于 table1 的 Productid 中,则需要将 stock 的值作为新行插入 table2 中的 table1 中。

所以在table1中执行查询后输出如下:

+-----------+-------+
| productid | stock |
+-----------+-------+
|         1 |    20 |
|         2 |    40 |
|         3 |    30 |
|         4 |    10 |
+-----------+-------+

帮助我获取查询,因为我是 SQL 新手。提前致谢!

【问题讨论】:

  • 请标记您正在使用的数据库。您请求的操作通常称为“upsert”,最佳方式因数据库而异。
  • 我使用的是 SQL Server 2017

标签: sql join sql-insert sql-server-2017


【解决方案1】:

您需要一个 MERGE 语句。现在大多数数据库管理系统都支持它:

MERGE INTO table1
USING table2
   ON table1.productid=table2.pid
WHEN MATCHED THEN UPDATE SET
  stock = table2.stock
WHEN NOT MATCHED THEN INSERT VALUES (
  table2.pid
, table2.stock
)
;

SELECT * FROM table1 ORDER BY 1;
-- out  OUTPUT 
-- out --------
-- out       3
-- out (1 row)
-- out 
-- out Time: First fetch (1 row): 27.090 ms. All rows formatted: 27.155 ms
-- out  productid | stock 
-- out -----------+-------
-- out          1 |    20
-- out          2 |    40
-- out          3 |    30
-- out          4 |    10

【讨论】:

    猜你喜欢
    • 2020-05-22
    • 1970-01-01
    • 1970-01-01
    • 2021-04-06
    • 1970-01-01
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    相关资源
    最近更新 更多