【问题标题】:SQL - Assigning values from external tableSQL - 从外部表分配值
【发布时间】:2021-07-21 04:17:32
【问题描述】:

我有一个包含客户 ID 和优惠券的两列表。我想通过将来自外部数据列表的凭证分配给每个客户的 ID 来填写“优惠券”列。而且,代码一旦分配,就不能再分配给其他客户。

你能帮我写一个 SQL 查询吗?

Table:
| Customer ID | Coupon |
| -------- | -------------- |
| 100  |            |
| 200  |           |
| 300 |           |

Data list:
| Voucher ID | Voucher |
| -------- | -------------- |
| 1   |      j2h3h2      |
| 2  |      hfd7s8     |
| 3  |    fsdfs72       |

Final result
| Customer ID | Coupon |
| -------- | -------------- |
| 100   |      j2h3h2      |
| 200  |      hfd7s8     |
| 300  |    fsdfs72       |

【问题讨论】:

  • 我们应该如何确定哪个优惠券分配给哪个客户?分配是否必须是确定性的(每次执行时都相同)?是否总是有足够的优惠券可供每位客户使用一张优惠券?优惠券会比顾客多吗?为什么最终结果包含的是优惠券的字符串,而不是它的id?
  • 哪个优惠券分配给哪个客户都没有关系。优惠券对每位客户均有效,但单个客户应收到单独的优惠券。仅应为尚未分配代码的客户进行分配,因此其 ID 的“优惠券”值为空。假设有足够的优惠券。现在没关系,我只是想测试一下机制。是的,优惠券总是比顾客多。包含客户的表格每天都会更新,因此之前未分配的优惠券应分配给新客户。
  • 我们想将优惠券的字符串发送给客户,这就是我们使用它而不是 ID 的原因。
  • 哪个数据库管理系统?语法在它们之间有所不同。 (将光标悬停在SQL 标签上以获取更多信息。)
  • 你的意思是 - MySQL?

标签: mysql sql mysql-8.0


【解决方案1】:

正如您所说,您使用的是 MySQL 8,我将使用 Common Table Expressions 和 ROW_NUMBER() 创建按顺序编号的行。

然后我可以将它们加入到正在更新的表中,并相互连接,将新的凭证 ID 分配给没有的客户。

我还将使用术语voucher,因为您似乎可以互换使用优惠券和优惠券。

WITH
  renumbered_customer AS
(
  -- Find all rows in the customer table that do Not have an assigned voucher
  -- Number those rows sequentially from 1 upwards
  SELECT
    *,
    ROW_NUMBER() OVER (ORDER BY customer_id)   AS row_id
  FROM
    customer
  WHERE
    voucher_id IS NULL
),
  renumbered_voucher AS
(
  -- Find all rows in the voucher table that have not bee assigned to a customer
  -- Number those rows sequentially from 1 upwards
  SELECT
    *,
    ROW_NUMBER() OVER (ORDER BY voucher_id)   AS row_id
  FROM
    voucher
  WHERE
    NOT EXISTS (
      SELECT *
        FROM customer
       WHERE customer.voucher_id = voucher.voucher_id
    )
)
UPDATE
  customer
INNER JOIN
  renumbered_customer  c
    ON c.customer_id = customer.customer_id
INNER JOIN
  renumbered_voucher   v
    ON c.row_id = v.row_id
SET
  customer.voucher_id = v.voucher_id
;

工作演示:https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=29875e64b3de3559ceea20d85d222f9b

【讨论】:

  • 非常感谢!我会测试它并让你知道它是否有效:)
猜你喜欢
  • 2020-12-26
  • 1970-01-01
  • 2020-11-14
  • 2018-09-29
  • 2016-10-29
  • 1970-01-01
  • 1970-01-01
  • 2012-10-29
  • 1970-01-01
相关资源
最近更新 更多