By using db<>fiddle, you agree to license everything you submit by Creative Commons CC0.
CREATE TABLE voucher (
voucher_id INT,
voucher_code VARCHAR(32)
);
INSERT INTO
voucher
VALUES
(0, 'used_voucher'), -- A voucher that has already been used
(1, 'j2h3h2'),
(2, 'hfd7s8'),
(3, 'fsdfs72')
;
SELECT * FROM voucher;
Records: 4 Duplicates: 0 Warnings: 0
voucher_id | voucher_code |
---|---|
0 | used_voucher |
1 | j2h3h2 |
2 | hfd7s8 |
3 | fsdfs72 |
CREATE TABLE customer (
customer_id INT,
voucher_id INT
);
INSERT INTO
customer
VALUES
(0, 0 ), -- Customer who already has a voucher
(100, NULL),
(200, NULL),
(300, NULL)
;
SELECT * FROM customer;
Records: 4 Duplicates: 0 Warnings: 0
customer_id | voucher_id |
---|---|
0 | 0 |
100 | null |
200 | null |
300 | null |
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
Rows matched: 3 Changed: 3 Warnings: 0
SELECT
c.customer_id, v.voucher_code
FROM
customer c
LEFT JOIN
voucher v
ON v.voucher_id = c.voucher_id
customer_id | voucher_code |
---|---|
0 | used_voucher |
100 | j2h3h2 |
200 | hfd7s8 |
300 | fsdfs72 |