Order by com apelido usando UNION SELECT

Fala pessoal, tudo certo? estava tentando fazer um SELECT UNION e precisava usar um ORDER BY de 2 campos específicos, porém quando tento executar a partir de um apelido ele me retorna um erro

por exemplo SELECT tbt.*, nfs.*, nfe.*, pag.* FROM tributocst as tbt, NFSaida as nfs, NFEntrada as nfe, formapagtovenda as pag WHERE tribCod = 1 AND nfe.idnfentrada = 652 AND nfs.idnfsaida = 200 UNION SELECT tbt.*, nfs.*, nfe.*, pag.* FROM tributocst as tbt, NFSaida as nfs, NFEntrada as nfe, formapagtovenda as pag WHERE tribCod = 2 AND nfe.idnfentrada = 652 AND nfs.idnfsaida = 200 ORDER BY tribcod

Assim funciona certinho, mas precisaria ordenar por um campo que existe em mais de uma tabela, por exemplo o numero, isso me retornaria a exceção de ambiguidade pois existe em mais de uma tabela, e se eu tento acessar usando nfs.numero para pegar o numero apenas desta tabela me retorna a exceção ERROR: missing FROM-clause entry for table "nfs" LINE 22: ORDER BY nfs.numero, alguém teria uma possível solução pra isso? eu não consegui encontrar nada que pudesse me ajudar nesse tipo de querye, desde já agradeço!

Não está claro pra que você precisa do union, se está selecionando os mesmos campos nos dois selects, e a única diferença é o tribCod (1 e 2). Se é só isso, adicione no where e use um select só:

SELECT tbt.*, nfs.*, nfe.*, pag.* 
FROM tributocst as tbt, NFSaida as nfs, NFEntrada as nfe, formapagtovenda as pag 
WHERE tribCod in (1, 2)
AND nfe.idnfentrada = 652 
AND nfs.idnfsaida = 200

ou

WHERE (tribCod = 1 or tribCod = 2)

ou mesmo

WHERE tribCod between 1 and 2

ou até

WHERE tribCod >= 1 and tribCod <= 2

Outra coisa é que você está usando select nome_da_tabela.* . Usando asterisco, você traz todas as colunas das tabelas, o que deve ser evitado sempre que possível, por questões de desempenho (memória e processamento). Prefira sempre trazer somente as colunas necessárias pra oeração que vai realizar.

Sobre o erro que você colocou, não me parece um erro com o campo que você escolheu pra ordenar, mas sim a sintaxe do select (a posição da cláusula from ou order nesse select). Coloque aqui o select que você usou pra testar.

Sobre o union especificamente, se você precisa ordenar por um campo de mesmo valor e posição no select em tabelas distintas, algo comum é usar o índice do campo no select para ordenar todas as tabelas envolvidas. Algo como:

select notas_de_entrada.numero, notas_de_entrada.data_de_emissao, notas_de_entrada.valor from notas_de_entrada where notas_de_entrada.numero = 1111
union
select notas_de_saida.numero, notas_de_saida.data_de_emissao, notas_de_saida.valor from notas_de_saida where notas_de_saida.numero = 1111
order by 2

No exemplo, o resultado será ordenado pelo campo data_de_emissao (índice 2), independente de qual seja a tabela.

Note que isso fica mais fácil sem usar o *, somente com os campos necessários, pois aí é óbvio qual o campo que está sendo usado na ordenação.

Abraço.

Um outro (grave) problema desta query é que não tem qualquer join ou condições de junção das tabelas no where. Com isto vais trazer o resultado vai ser o produto cartesiano (todas as combinações possiveis de todas as linhas de todas as tabelas). Aposto que não é isso que pretendes. Tens de dizer, através de join ou do where como é que as tabelas se relacionam entre si.

Bom dia pessoal, esse SQL ali eu montei rapidinho de exemplo, no sql que eu estou trabalhando mesmo eu teria que ordenar por duas datas, a dataAtendimento e a dataEntregaMaterial, e usando os as duas comparações no Where (WHERE dataAtendimento >= … OR dataEntregaMaterial >= …) ficou muito lento, o UNION foi a melhor forma que eu achei pra poder evitar de ter que mexer muito no código já, A query em si retorna os objeto inteiros mesmo, que por mais que eu concorde que é complicado de manter e lento, é como é feito na empresa que trabalho a mais de 10 anos… ai não teria muito o que fazer…

Você pode ser mais específico com o resultado pretendido? Pois assim podemos te ajudar melhor.

Precisa ordenar as mesmas tabelas por 2 campos diferentes? Ou são tabelas distintas? Com union nas mesmas tabelas, você basicamente tem registros duplicados, é isso mesmo que precisa? Que problema essa consulta precisa resolver? Dê exemplos mais concretos, possivelmente com a estrutura das tabelas (não precisa ser todos os campos, só os relevantes) e alguns exemplos de dados (não precisam ser reais, mas coerentes com o problema).

Abraço.

é uma consulta que fazia um select retornando vários objetos(no sistema esses objetos serviam cada um pra algo específico dentro do sistema, os campos em questão são Exame, PacienteAtend, Paciente, SerieAmostra, entre alguns outros), eu precisaria retornar por ordem de exame e por nome ou seja, ORDER BY e.exameCod, pa.nome;, porém com o select UNION isso não parece ser possível, o problema em si e o motivo de usar o union, é pq estava muito lento fazer a consulta utilizando a cláusula WHERE (pa.dataAtend > ... OR pa.DataEntregaMaterial > ...), ele repetia a mesma cláusula pra comparar o inverso e isso estava gerando uma consulta que levava até 10 minutos pra ser executada, outro fato é que é obrigatório executar pelas duas condições, pq se não tiver em uma, pode ter na outra. A ideia principal era não mexer muito na estrutura do código.

Caso o Banco seja muito grande e usando Union poderá lotar a memoria e SO passa a usar swap disco, então a lentidão será garantida.
São grandes as Tabelas?

algumas sim e algumas não, o retorno delas em si não é muita coisa, mas por carregar varios objetos, no sistema pra trazer 2 linhas do banco as vezes estava demorando 5 a 10 minutos

Entre 5 e 10 minutos pode ser uma eternidade ou extremamente rápido. Tudo depende.
Já conferiu os índices, os blocos que interessam, as quebras ?