Assuming your index tag names are matching the field names, yes, that would be one equicvalent way to deleting.
Regarding the flaw, it's reproducable to me using the tables as is, but not an fresh copied and reindexed data, so it's hard to hand out code creating a repro. My guess is that it all depends on the index. An index can be correct and still not work best for seeking values, that's because of the nature of an index being a tree, updates causing a less ideal but still not wrong index, than creating it freshly in one run. That's also a reason to reindex once in a while.
As the select sql was fast in any case, there must be some flaw anyway, in how delete-sql makes different use of the index. You could maybe profit from the select-sql being fast, doing something like selecting all the IDs of the records, which should be deleted and then deleting them by seeking to these IDs or via inner joining to this result. But you'd end up with an even more complex and maintainance unfreindly select.
I'd actually keep your original delete as a comment, for docuemting how this xbase code can be done with sql. That'll make it easier to understand and migrate to some sql backend later.
Bye, Olaf.