I've often been in the situation where I want to get some value from the (currently) last line in a table. For example, if I want to get the customer number of the last order entered into the system. I would do this by means of two statements:
SELECT MAX (ORD) INTO :MORD FROM ORDERS; SELECT CUST FROM ORDERS WHERE ORD = :MORD;
In case anyone was wondering, the following is illegal syntax
SELECT CUST FROM ORDERS WHERE ORD = MAX (ORD);
But it turns out that there is a way of getting the desired value in one statement, although to be fair, the statement includes a subquery, albeit with special syntax. Below are two statements; the first works in Firebird but not in Priority SQL whereas the second works in both Priority and Firebird, although the Firebird query is very slow.
/* this gives an 'ambigous column name CUST' error in Priority */ SELECT O1.CUST FROM ORDERS O1 WHERE O1.ORD = (SELECT MAX (O2.ORD) FROM ORDERS O2); /* this works in Priority */ SELECT O1.CUST FROM ORDERS O1 WHERE O1.ORD IN (SELECT MAX (O2.ORD) FROM ORDERS O2);
Something else to be filed under 'Learn something new every day'.
No comments:
Post a Comment