Okay, I have two tables - ORDERS and ORDERLINES - which have essentially the same problem, with triggers on each to address the issue. The issue is that in addition to the PK with table-level uniqueness, on a field called RECID, there is another field, RECNO, which needs to be unique with relation to another field. 

The tables are FK related as follows: 

`ORDERS.WAREHOUSEID > WAREHOUSES.CUSTOMERID > CUSTOMERS`

and 

`ORDERSLINES.ORDERID > ORDERS`

On `ORDERS` and `ORDERSLINES` I have `BEFORE INSERT` triggers to assign the realm-specific unique **RECNO**.  

In `ORDERS`, **RECNO** needs to be unique within the realm of a `CUSTOMERS` record.  

In `ORDERLINES`, **RECNO** needs to be unique within the realm of an `ORDERS` record.

The trigger on `ORDERS` works perfectly fine. When a new order is inserted, it is assigned the next unique **RECNO** within the customer it belongs to. 

The trigger on `ORDERLINES` on the other hand, which should assign the next unique **RECNO** within the order it belongs to, throws the dreaded ***{ORA-04091: table ORDERLINES is mutating, trigger/function may not see it}*** exception.

Here is the trigger that works:

```
CREATE OR REPLACE TRIGGER ORDERS_BI 
BEFORE INSERT ON ORDERS 
FOR EACH ROW
DECLARE
    CUSTID  WAREHOUSES.CUSTOMERID%TYPE;
BEGIN
    SELECT MIN(CUSTOMERID) INTO CUSTID FROM WAREHOUSES 
        WHERE NVL(WARE_ID, '-') = NVL(:NEW.WAREHOUSEID, '-');

    SELECT NVL(MAX(RECNO), 0) + 1
        INTO :NEW.RECNO
        FROM deploy.ORDERS O
        LEFT JOIN deploy.WAREHOUSES W
            ON NVL(W.REC, '-') = NVL(O.WAREHOUSEID, '-')
        WHERE NVL(W.CUSTOMERID, '-') = NVL(CUSTID, '-');
END;

```

And here is the trigger that does ***NOT*** work:

```
CREATE OR REPLACE TRIGGER ORDERLINES_BI 
BEFORE INSERT ON ORDERLINES 
FOR EACH ROW
DECLARE
    nORDERID ORDERLINES.ORDERID%TYPE;
BEGIN
    SELECT MIN(ORDERID) INTO nORDERID FROM REVORDERS 
        WHERE ORDERID = :NEW.ORDERID;

    SELECT NVL(MAX(RECNO), 0) + 1
      INTO :NEW.RECNO
      FROM deploy.ORDERLINES L
      LEFT JOIN deploy.ORDERS O
        ON O.ORDERID = L.ORDERID
      WHERE O.ORDERID = nORDERID;
END;

```

Can SOMEONE please explain WHY the first one works, and the second one doesn't? 
And is there some way I can re-write the second to make it work?