Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL-从外部表分配值_Mysql_Sql_Mysql 8.0 - Fatal编程技术网

Mysql SQL-从外部表分配值

Mysql SQL-从外部表分配值,mysql,sql,mysql-8.0,Mysql,Sql,Mysql 8.0,我有一个两列的表格,上面有客户ID和优惠券。我想通过将外部数据列表中的凭证分配给每个客户的ID来填写“优惠券”列。此外,一旦分配了代码,就不能再将其分配给其他客户 你能帮我写一个SQL查询吗 Table: | Customer ID | Coupon | | -------- | -------------- | | 100 | | | 200 | | | 300 | | Data list: | Voucher ID | Vo

我有一个两列的表格,上面有客户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       |

正如您所评论的,您正在使用MySQL 8,我将使用公共表表达式和
ROW\u NUMBER()
来创建顺序编号的行

然后,我可以将它们连接回正在更新的表,并相互连接,以便将新的凭证id分配给没有凭证id的客户

我还将使用术语
凭单
,因为您似乎互换使用了凭单和优惠券

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
;

工作演示:

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