Fórum Sub-query nao funciona no Interbase?? #44926

17/06/2004

0

Não consigo de jeito nenhum fazer uma sub-query no Interbase na forma:

SELECT X,Y,Z FROM
(SELECT A,B,C FROM TABELA)

Aliás, notei que só consigo usar sub-query na cláusula WHERE, como:

SELECT * FROM TABELA
WHERE EXITS (SELECT A,B,C FROM TABELA2) etc etc

Mas o problema é que tenho uma UNION com 3 tabelas e preciso ordená-la por um dos campos, mas como fazer isso no Interbase? No Oracle, SQL Server ou DB2 eu uso:

SELECT X,Y,Z FROM (
SELECT X,Y,Z FROM TABELA1
UNION ALL
SELECT X,Y,Z FROM TABELA2
UNION ALL
SELECT X,Y,Z FROM TABELA3 ) AS T
ORDER BY X

No Interbase nao funciona, faço apenas as UNION como abaixo, mas sai tudo fora de ordem:

SELECT X,Y,Z FROM TABELA1
UNION ALL
SELECT X,Y,Z FROM TABELA2
UNION ALL
SELECT X,Y,Z FROM TABELA3

O que fazer?


Skyzytuz

Skyzytuz

Responder

Posts

17/06/2004

Gandalf.nho

Já tentou usar VIEWs?


Responder

Gostei + 0

18/06/2004

Skyzytuz

Sim, com views naturalmente funciona...

Só que eu não queria ´poluir´ o banco com dezenas de views, visto que faço amplo uso sub-queryes em diversos lugares, tanto dentro de storeds como em TQuerys usadas para relatórios no Delphi.

Mas parece que não há outra solução mesmo...


Responder

Gostei + 0

18/06/2004

Afarias

Mas parece que não há outra solução mesmo...


Não tem mesmo!

Mas nos casos das UNION não tem nada q ver com isso e no IB/FB funciona perfeitamente.


T+


Responder

Gostei + 0

19/06/2004

Bon Jovi

Melhor mudar de banco se puder. Pô, até Access q não é SGDB aceita isso! (Não q eu o recomende pra aplicações Cliente/Servidor).

Criar muitas Views realmente deixa o banco poluído..., além de stored procedures, etc. O melhor é o banco de dados só cuidar dos dados e a parte funcional ser sempre via aplicação servidora. Imagina manter views/stored procedures repetidas pra cada banco diferente q a aplicação for usar..., se não usa vários agora, pode ser q mais tarde sim, ou então mudança pra outro banco. Prender a aplicação em um banco só é pedir retrabalho futuro.


Responder

Gostei + 0

19/06/2004

Bon Jovi

Ah.. tinha esquecido, uma ótima opção é o PostgreSQL, a versão comercial pra Windows é quase o mesmo preço do Interbase, e melhor, esse preço sem limitação de acessos ao banco, onde o Interbase sai bem mais caro neste caso.

Claro, se houver possibilidade de troca de banco no seu caso... Não é conversa de vendedor, só estou querendo expor que existe opção melhor no mercado do que o Interbase, e respeitando o custo.

A maioria dos programadores Delphi se levam pro mundo Interbase/Fb pelo fato de ter sido um produto q cresceu em uso por ser parte integrante do Delphi, e as vezes deixam de ver SGDBs melhores.. Não que Ib seja ruim, por si só é ótimo, mas cada caso é um caso.., pra aplicações multibanco ele é um dos q já me deram mais trabalho pra tratar ´ifs´.


Responder

Gostei + 0

20/06/2004

Skyzytuz

Infelizmente o IB é compulsório, foi imposição do cliente. O jeito é meter a mão na massa e entupir o banco de views mesmo, não há solução.

Só fiquei muito surpreso de um banco como o IB não aceitar sub-query, é o primeiro banco que vejo (além do MySql) com essa limitação. (E olha que não estou falando de sub-querys na cláusula WHERE, essas quase não uso pois quase sempre dá para substituir por JOINs, muito mais eficientes)

Outra coisa que estranhei é a impossibilidade de usar na mesma query dados de dois databases diferentes. Vou ter que reunir as tabelas de todos os sistemas e jogar tudo em um imenso banco único. Por si só, isso não é problema algum, apenas acho desorganizado jogar as tabelas de sistemas diferentes em um único banco.


Responder

Gostei + 0

20/06/2004

Bon Jovi

Sobre nao poder acessar vários bancos numa mesma query, tb é decepcionante isso. Mas tb dá pra fazer via programa, pra nao ter q fazer essa ´desorganizacao´ no SGDB.

Mas ao mesmo tempo seria deixar o banco organizado e o programa ´desorganizado´:

DataSet1.Connection := ConnectionBanco1;
DataSet1.Open;

DataSet2.Connection := ConnectionBanco2;
DataSet2.Open;

//tendo a necessidade, manipular relacao entre os dois via while not Eof...

: / é feio tb, mas é só pra expor essa possibilidade...


Responder

Gostei + 0

20/06/2004

Skyzytuz

[quote:a8d91d0bd3=´Bon Jovi´]Sobre nao poder acessar vários bancos numa mesma query, tb é decepcionante isso. Mas tb dá pra fazer via programa, pra nao ter q fazer essa ´desorganizacao´ no SGDB.
Mas ao mesmo tempo seria deixar o banco organizado e o programa ´desorganizado´:
DataSet1.Connection := ConnectionBanco1;
DataSet1.Open;
DataSet2.Connection := ConnectionBanco2;
DataSet2.Open;
[/quote:a8d91d0bd3]

É uma possibilidade, mas como você mesmo salientou, geraria uma bagunça danada no código, não vale a pena.

Aproveitando , o que posso fazer com a instrução SET DATABASE? Não consegui fazê-la funcionar e confessa que nem mesmo entendi direito sua real função.


Responder

Gostei + 0

21/06/2004

Bon Jovi

Nao conheço SET DATABASE. O que gostaria nesse caso? Ou é ainda o lance de acessar duas bases numa query?


Responder

Gostei + 0

21/06/2004

Afarias

[quote:ef68f6d6a1=´Bon Jovi´]Melhor mudar de banco se puder. Pô, até Access q não é SGDB aceita isso! (Não q eu o recomende pra aplicações Cliente/Servidor). [/quote:ef68f6d6a1]

Interessante este conselho... :lol:


[quote:ef68f6d6a1=´Bon Jovi´]Criar muitas Views realmente deixa o banco poluído..., além de stored procedures, etc.[/quote:ef68f6d6a1]

Engraçado q VIEWs e STORED PROCs jão justamente o grande lance de SGBD-Rs


[quote:ef68f6d6a1=´Bon Jovi´]O melhor é o banco de dados só cuidar dos dados e a parte funcional ser sempre via aplicação servidora. Imagina manter views/stored procedures repetidas pra cada banco diferente q a aplicação for usar..., [/quote:ef68f6d6a1]

Particularmente tenho uma opnião bem diferente.


T+


Responder

Gostei + 0

21/06/2004

Skyzytuz

[quote:c381f598f4=´Bon Jovi´]Nao conheço SET DATABASE. O que gostaria nesse caso? Ou é ainda o lance de acessar duas bases numa query?[/quote:c381f598f4]

Exato. Não achei nenhuma documentação que realmente explicasse a utilidade deste comando, apenas se limitam a sintaxe.


Responder

Gostei + 0

21/06/2004

Skyzytuz

Engraçado q VIEWs e STORED PROCs jão justamente o grande lance de SGBD-Rs


Sim, mas como qualquer outro recurso, não é panacéia. VIEWS e STOREDs são ótimas para representar as regras de negócio e simplificar as consultas mais comuns aos dados, mas daí a ser obrigado a criar uma nova VIEW apenas porque eu tenho um novo relatório com apenas um detalhe qualquer diferente de outro (como uma ordenação), é bem diferente.

Imagine eu ter 5 relatórios iguais e mude apenas a ordenação, preciso criar 5 VIEWS? Claro que não.


Responder

Gostei + 0

21/06/2004

Afarias

Não vejo qual a ´panacéia´ de 5 VIEWS!!!

mas, voltando ao assunto, pq vc não posta aqui a consulta q quer fazer... é possível apenas q vc não esteja sabendo usar os recursos do SELECT corretamente!

Eu, particularmente, raramente senti falta de um recurso de sub-query.


T+


Responder

Gostei + 0

21/06/2004

Skyzytuz

mas, voltando ao assunto, pq vc não posta aqui a consulta q quer fazer... é possível apenas q vc não esteja sabendo usar os recursos do SELECT corretamente!


Vide a primeira msg deste tópico. Note que é impossível ordenar as 3 UNION sem usar uma sub-query OU uma VIEW.

De qq forma, para mim é caso encerrado, a solução com VIEW está ok. Apenas estranhei o IB não aceitar sub-query, pois simplesmente acho mais elegante (e econômico) resolver pontualmente com sub-query no componente TQuery do que criar uma VIEW só para satisfazer uma única consulta oriunda de um único relatório.


Responder

Gostei + 0

21/06/2004

Afarias

Vide a primeira msg deste tópico. Note que é impossível ordenar as 3 UNION sem usar uma sub-query OU uma VIEW.


Já disse q é possível!

Vc só não pode ordenar as diferentes querys por campos diferentes!! E, isso nào tem nada q ver com sub-querys (ao meu ver)


T+


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar