/* JOIN ... ON hash-join fast path. */ PROCEDURE Main() LOCAL n FErase("cust.dbf"); FErase("ord.dbf"); FErase("out.dbf") /* Customers (master) */ dbCreate("cust.dbf", { {"CID","N",4,0}, {"CNAME","C",12,0} }) USE cust.dbf NEW EXCLUSIVE ALIAS cu dbAppend(); FieldPut(1, 1); FieldPut(2, "Alice") dbAppend(); FieldPut(1, 2); FieldPut(2, "Bob") dbAppend(); FieldPut(1, 3); FieldPut(2, "Carol") dbCommit() dbCloseArea() /* Orders (detail) */ dbCreate("ord.dbf", { {"OID","N",4,0}, {"CID","N",4,0}, {"AMT","N",8,2} }) USE ord.dbf NEW EXCLUSIVE ALIAS od dbAppend(); FieldPut(1, 100); FieldPut(2, 1); FieldPut(3, 50) dbAppend(); FieldPut(1, 101); FieldPut(2, 1); FieldPut(3, 30) dbAppend(); FieldPut(1, 102); FieldPut(2, 2); FieldPut(3, 200) dbAppend(); FieldPut(1, 103); FieldPut(2, 4); FieldPut(3, 99) /* no-match */ dbCommit() dbCloseArea() USE cust.dbf NEW EXCLUSIVE ALIAS cu USE ord.dbf NEW EXCLUSIVE ALIAS od SELECT cu /* Hash-join form */ JOIN WITH od TO out.dbf FIELDS cid, cname, oid, amt ON cid = cid SELECT cu ; dbCloseArea() SELECT od ; dbCloseArea() USE out.dbf NEW EXCLUSIVE COUNT TO n ? "Hash-joined rows =", n, "(expect 3)" dbGoTop() DO WHILE !Eof() ? " ", FieldGet(1), AllTrim(FieldGet(2)), FieldGet(3), FieldGet(4) dbSkip() ENDDO ? "(expect three rows: Alice/100/50, Alice/101/30, Bob/102/200)" dbCloseArea() FErase("cust.dbf"); FErase("ord.dbf"); FErase("out.dbf") ? "DONE" RETURN