Are the tables linked using ODBC - if so I think it is the outer join that is causing you grief. The ODBC driver has to convert that to either T-SQL or ANSI SQL and that may be the source of the problem. I would probably create a temporary table with just the ClientID of those records with no order, then do the delete using a equi-join to the temporary table.

Yes, the Access front end is linked to the SQL database back end by ODBC.

I tried adding an extra criterion in the WHERE statement to specify a range of records by ClientId, and an ORDER BY statement to sort the results by ClientId when previewing the results as a select query, and these additions seem to work OK.

SELECT *
FROM dbo_Client
WHERE (((dbo_Client.ClientId)<1000 And (dbo_Client.ClientId) Not In (SELECT ClientId FROM dbo_Order)) AND ((dbo_Client.NewClient)=True))
ORDER BY dbo_Client.ClientId;

However, when I switch this to a delete query and save it, Access converts the SQL code like this.

DELETE dbo_Client.ClientId, dbo_Client.NewClient, *
FROM dbo_Client
WHERE (((dbo_Client.ClientId)<1000 And (dbo_Client.ClientId) Not In (SELECT ClientId FROM dbo_Order)) AND ((dbo_Client.NewClient)=True));

This seems to work OK, but should the first line be changed back to just DELETE * each time?