add batch remove batch split batch comment selection show hidden batches hide batch highlight batch
db<>fiddle
donate feedback about
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