You don't!
As @JamesK mentioned, there are absolutely no guarantee, in which order the rows are returned (unless using "order by").
I have not tried the suggestion from @Ifor, but as he mentioned --> no guarantee. And you also mentioned, no index should be used.
The way you do the "create table" leads me to belive, you are not using Microsoft SQL Server (but I could be wrong). It looks like Oracle and maybe Oracle has some kind of guarantee regarding "not order by" that Microsoft doesn't (but I doubt it).
Now, I couldn't help but try to come up with some sort of solution, as this request is "just to stupid or tricky".
My attempts:
option 1) have the frontend program do the sorting, thus "order by" is not used.
option 2) "stuff" all data in at declared string, using while loop counting from min value to max value. Split it with "string_split" (which I belive splits in the order from left to right. I'm not sure if this is guaranteed, but I'm pretty sure).
create table test_sort(id int, amt int);
insert into test_sort values(10,100);
insert into test_sort values(20,300);
insert into test_sort values(30,50);
insert into test_sort values(40,10);
insert into test_sort values(50,400);
declare @i1 int=0;
declare @i2 int=0;
declare @txt varchar(max)='';
select @i1=min(amt),@i2=max(amt) from test_sort;
while(@i1<=@i2)
begin
select @txt+='¤'+cast(id as varchar(10))+'§'+cast(amt as varchar(10))
from test_sort
where amt=@i1
;
set @i1+=1;
end;
select left(value,charindex('§',value)-1) as id
,right(value,len(value)-charindex('§',value)) as amt
from string_split(right(@txt,len(@txt)-1),'¤')
;
drop table test_sort;
Lastly I have to say: Don't EVER use this method, as it's a performance killer and has the limit of the max size of varchar.