-- Migrated from DuckDB test: test/sql/join/right_outer/ pattern tests
-- Tests right join patterns
CREATE TABLE inventory(item_id INTEGER, item_name VARCHAR, stock_quantity INTEGER, ts TIMESTAMP TIME INDEX);

Affected Rows: 0

CREATE TABLE purchase_orders(po_id INTEGER, item_id INTEGER, ordered_qty INTEGER, order_date DATE, ts TIMESTAMP TIME INDEX);

Affected Rows: 0

INSERT INTO inventory VALUES
(1, 'Widget A', 100, 1000), (2, 'Widget B', 50, 2000), (3, 'Widget C', 0, 3000);

Affected Rows: 3

INSERT INTO purchase_orders VALUES
(1, 1, 25, '2023-01-01', 1000), (2, 2, 30, '2023-01-02', 2000),
(3, 4, 15, '2023-01-03', 3000), (4, 5, 40, '2023-01-04', 4000),
(5, 1, 10, '2023-01-05', 5000);

Affected Rows: 5

-- Right join to show all orders (including for non-inventory items)
SELECT
  po.po_id, po.ordered_qty, po.order_date,
  COALESCE(i.item_name, 'Unknown Item') as item_name,
  COALESCE(i.stock_quantity, 0) as current_stock
FROM inventory i
RIGHT JOIN purchase_orders po ON i.item_id = po.item_id
ORDER BY po.order_date, po.po_id;

+-------+-------------+------------+--------------+---------------+
| po_id | ordered_qty | order_date | item_name    | current_stock |
+-------+-------------+------------+--------------+---------------+
| 1     | 25          | 2023-01-01 | Widget A     | 100           |
| 2     | 30          | 2023-01-02 | Widget B     | 50            |
| 3     | 15          | 2023-01-03 | Unknown Item | 0             |
| 4     | 40          | 2023-01-04 | Unknown Item | 0             |
| 5     | 10          | 2023-01-05 | Widget A     | 100           |
+-------+-------------+------------+--------------+---------------+

-- Right join with aggregation
SELECT
  po.item_id,
  COUNT(po.po_id) as order_count,
  SUM(po.ordered_qty) as total_ordered,
  COALESCE(MAX(i.stock_quantity), 0) as stock_level,
  CASE WHEN i.item_id IS NULL THEN 'Not In Inventory' ELSE 'In Stock' END as inventory_status
FROM inventory i
RIGHT JOIN purchase_orders po ON i.item_id = po.item_id
GROUP BY po.item_id, i.item_id
ORDER BY order_count DESC, po.item_id ASC;

+---------+-------------+---------------+-------------+------------------+
| item_id | order_count | total_ordered | stock_level | inventory_status |
+---------+-------------+---------------+-------------+------------------+
| 1       | 2           | 35            | 100         | In Stock         |
| 2       | 1           | 30            | 50          | In Stock         |
| 4       | 1           | 15            | 0           | Not In Inventory |
| 5       | 1           | 40            | 0           | Not In Inventory |
+---------+-------------+---------------+-------------+------------------+

-- Right join to identify missing inventory records
SELECT
  po.item_id as missing_item_id,
  COUNT(*) as orders_for_missing_item,
  SUM(po.ordered_qty) as total_qty_ordered
FROM inventory i
RIGHT JOIN purchase_orders po ON i.item_id = po.item_id
WHERE i.item_id IS NULL
GROUP BY po.item_id
ORDER BY total_qty_ordered DESC, po.item_id ASC;

+-----------------+-------------------------+-------------------+
| missing_item_id | orders_for_missing_item | total_qty_ordered |
+-----------------+-------------------------+-------------------+
| 5               | 1                       | 40                |
| 4               | 1                       | 15                |
+-----------------+-------------------------+-------------------+

-- Right join with filtering and conditions
SELECT
  po.po_id,
  po.item_id,
  po.ordered_qty,
  COALESCE(i.item_name, 'Missing from inventory') as item_description,
  CASE
    WHEN i.item_id IS NULL THEN 'Order for unknown item'
    WHEN i.stock_quantity < po.ordered_qty THEN 'Insufficient stock'
    ELSE 'Can fulfill'
  END as fulfillment_status
FROM inventory i
RIGHT JOIN purchase_orders po ON i.item_id = po.item_id
ORDER BY po.order_date;

+-------+---------+-------------+------------------------+------------------------+
| po_id | item_id | ordered_qty | item_description       | fulfillment_status     |
+-------+---------+-------------+------------------------+------------------------+
| 1     | 1       | 25          | Widget A               | Can fulfill            |
| 2     | 2       | 30          | Widget B               | Can fulfill            |
| 3     | 4       | 15          | Missing from inventory | Order for unknown item |
| 4     | 5       | 40          | Missing from inventory | Order for unknown item |
| 5     | 1       | 10          | Widget A               | Can fulfill            |
+-------+---------+-------------+------------------------+------------------------+

DROP TABLE inventory;

Affected Rows: 0

DROP TABLE purchase_orders;

Affected Rows: 0

