danielrgoes Posted January 12, 2012 Report Share Posted January 12, 2012 E ai pessoal to com a seguinte situação vamos ver se alguém tem uma luzeu utilizo BD Firebird 1.5 e Delphi 2007 com o SQL, CDS,DSP e DSeu preciso fazer assim dar um selectSELECT DISTINCT COD_TABELA,COD_ITEM FROM ITEM_TABELA_PRECO WHERE COD_ITEM = 2e com o resultado dar outro select assim (sendo que eles tem COD_TABELA com PK e FK)SELECT COD_TABELA FROM TABELA_PRECO WHERE COD_TABELA = (resultado do outro)eu ate fiz um while e guarde os COD_TABELA em um ListBox ai depois montem uma frase com elemais é meio estranho assim se der muitos resultados o sistema vai ficar lerdoalguém tem alguma soluçao melhor ????? Quote Link to comment Share on other sites More sharing options...
0 Eder Moraes Posted January 12, 2012 Report Share Posted January 12, 2012 E ai pessoal to com a seguinte situação vamos ver se alguém tem uma luzeu utilizo BD Firebird 1.5 e Delphi 2007 com o SQL, CDS,DSP e DSeu preciso fazer assim dar um selectSELECT DISTINCT COD_TABELA,COD_ITEM FROM ITEM_TABELA_PRECO WHERE COD_ITEM = 2e com o resultado dar outro select assim (sendo que eles tem COD_TABELA com PK e FK)SELECT COD_TABELA FROM TABELA_PRECO WHERE COD_TABELA = (resultado do outro)eu ate fiz um while e guarde os COD_TABELA em um ListBox ai depois montem uma frase com elemais é meio estranho assim se der muitos resultados o sistema vai ficar lerdoalguém tem alguma soluçao melhor ?????Não entendi direito mais vou citar um exemplo que pode ajudar.SELECT A.campo, A.campo2, B.campo FROM tabela A INNER JOIN tabela B ON(B.campo_fk = A.campo_pk) WHERE A.campo_cod = "20";A consulta retorna valores contidos em campos da tabela B e em campos da tabela A, referentes a chave primaria da tabela A comparada a chave estrangeira da tabela B, faz a consulta pelo campo_cod=20, onde 20 seria somente um exemplo. Quote Link to comment Share on other sites More sharing options...
0 pimpocvl007 Posted January 13, 2012 Report Share Posted January 13, 2012 (edited) SELECT COD_TABELA FROM TABELA_PRECO WHERE COD_TABELA = (resultado do outro)...exemplo:SELECT COD_TABELA FROM TABELA_PRECO WHERE COD_TABELA IN (SELECT CD_TABELA FROM TABELA_DOIS WHERE CD_TABELA = 1);...o detalhe esta no "IN" seguido do select entre "parenteses" retornando resultado de um uniico campo (cd_tabela), ou seja, se você retornar mais de um campo (select campo1, campo2 from...) vai dar erro.Att.Olimpio Edited January 13, 2012 by pimpocvl007 Quote Link to comment Share on other sites More sharing options...
0 Micheus Posted January 13, 2012 Report Share Posted January 13, 2012 Como você pretende filtrar ITEM_TABELA, acho que a opção mais simples seria utilizar o JOIN. Experimente:SELECT DISTINCT I.COD_TABELA, I.COD_ITEM LEFT JOIN TABELA_PRECO P on (P.COD_TABELA = I.COD_TABELA)FROM ITEM_TABELA_PRECO IWHERE I.COD_ITEM = 2* como há campos com o mesmo nome em ambas as tabelas, voce precisa utilizar o alias (apelido), que neste caso foram I e P (pode ser qualquer coisa, mas devem que ser diferentes).Se funcionar, tem como benefício a possibilidade de voce bucar mais campos das tabelas - basta utilizar o referido alias e adicioná-los à linha do SELECT.obs: Este valor fixo (2), voce provavelmente irá trocar por parâmetro, não é?! Quote Link to comment Share on other sites More sharing options...
0 danielrgoes Posted January 16, 2012 Author Report Share Posted January 16, 2012 Como você pretende filtrar ITEM_TABELA, acho que a opção mais simples seria utilizar o JOIN. Experimente:SELECT DISTINCT I.COD_TABELA, I.COD_ITEM LEFT JOIN TABELA_PRECO P on (P.COD_TABELA = I.COD_TABELA)FROM ITEM_TABELA_PRECO IWHERE I.COD_ITEM = 2* como há campos com o mesmo nome em ambas as tabelas, voce precisa utilizar o alias (apelido), que neste caso foram I e P (pode ser qualquer coisa, mas devem que ser diferentes).Se funcionar, tem como benefício a possibilidade de voce bucar mais campos das tabelas - basta utilizar o referido alias e adicioná-los à linha do SELECT.obs: Este valor fixo (2), voce provavelmente irá trocar por parâmetro, não é?!Micheus ...O select funcionou perfeitoo fiz ele no IB ExpertPOrem tenho uma duvida que acho que você vai conseguir me responder como tenho SQL, CDS, DSP e DS ligado em uma tabela especifica, como vou usar o select que você me ensinouque como você disse usa itens de 2 tabelas diferentes,Ah e realmente o (2) não é fixo foi so para exemplificar Quote Link to comment Share on other sites More sharing options...
0 Micheus Posted January 16, 2012 Report Share Posted January 16, 2012 SQL, CDS, DSP e DS ligado em uma tabela especifica, como vou usar o select que você me ensinouque como você disse usa itens de 2 tabelas diferentes,Não entendi direito isto... :huh: A consulta irá trazer um resultado pronto - só precisa ser parametrizada (para tirar aquele "2" fixo)Voce vai precisar explicar quem está ligada(o) a quem (tabela ou consulta sql) para eu tentar lhe ajudar. Começando por: qual a relação desta consulta com a tal tabela específica? Quote Link to comment Share on other sites More sharing options...
0 danielrgoes Posted January 16, 2012 Author Report Share Posted January 16, 2012 SQL, CDS, DSP e DS ligado em uma tabela especifica, como vou usar o select que você me ensinouque como você disse usa itens de 2 tabelas diferentes,Não entendi direito isto... :huh: A consulta irá trazer um resultado pronto - só precisa ser parametrizada (para tirar aquele "2" fixo)Voce vai precisar explicar quem está ligada(o) a quem (tabela ou consulta sql) para eu tentar lhe ajudar. Começando por: qual a relação desta consulta com a tal tabela específica?Vamos lá geralmente uso pesquisa assimsql := 'SELECT * FROM ITEM_PEDIDO_COMPRA WHERE COD_COMPRA= 2' modulo.CDS_item_pedido_compra.close; modulo.SQL_item_pedido_compra.sql.clear; modulo.SQL_item_pedido_compra.sql.Add(sql); modulo.CDS_item_pedido_compra.Open();ai consigo trabalhar com os comandos:modulo.CDS_item_pedido_compra.recordcount;modulo.CDS_item_pedido_compra.eof etc ...No campo SQL do SQLQuery eu coloco a frase: SELECT * FROM ITEM_PEDIDO_COMPRAai o componente traz todos os campos da minha tabelaai como o ClientedataSet esta ligado ao DSP e o DSP esta ligado ao SQLQuery o ClienteDataSet tampem tem os campos pra eu trabalhar com eles.mais como usar o seu select ??????sendo que tem 2 tabelas ??? Quote Link to comment Share on other sites More sharing options...
0 Micheus Posted January 16, 2012 Report Share Posted January 16, 2012 Bom, eu não costumo usar CDS, então o que vou comentar pode não ser totalmente válido.Em termos de consulta, não deve haver qualquer problema uma implementação assim:sql := 'SELECT DISTINCT I.COD_TABELA, I.COD_ITEM LEFT JOIN TABELA_PRECO P on (P.COD_TABELA = I.COD_TABELA) FROM ITEM_TABELA_PRECO I WHERE I.COD_ITEM = :COD_ITEM'; ... with modulo do begin CDS_item_pedido_compra.close; SQL_item_pedido_compra.sql.text := sql; CDS_item_pedido_compra.Params.ParamByName('COD_ITEM').AsInteger := 2 CDS_item_pedido_compra.Open(); end;* eu troquei suas duas linhas para definição do SQL por uma só ;) Mas se voce pretende fazer atualizações nesta consulta, então poderia haver problemas sim. Estou meio enferrujado, mas para alguns componentes de acesso aos dados, existem condições em que mesmo referenciando mais que uma tabela na consulta, os dados poderiam ser atualizados - mas não posso afirmar que este será o caso. Só testando ou alguém que já o fez falar a respeito.Suponde que voce trouxesse várias colunas das "várias" tabelas envolvidas, dependendo de como seria feita a atualização dos dados (se usando componentes que não sejam DBGrid), talvez a utilização de datasets específicos para o updade pudessem ser utilizados. Eles ficariam ligados à consulta via DataSource (vinculados pelos campos chave) e viabilizariam o processo.obs: Apesar de simplicar as coisas, sempre que possível evite o uso do * na cláusula SELECT do SQL. Traga sempre apenas os campos de que precisa - assim você deixa sua consulta mais "leve" e evita o trânsito de informação desnecessária pela rede. Quote Link to comment Share on other sites More sharing options...
Question
danielrgoes
E ai pessoal to com a seguinte situação vamos ver se alguém tem uma luz
eu utilizo BD Firebird 1.5 e Delphi 2007 com o SQL, CDS,DSP e DS
eu preciso fazer assim dar um select
SELECT DISTINCT COD_TABELA,COD_ITEM FROM ITEM_TABELA_PRECO WHERE COD_ITEM = 2
e com o resultado dar outro select assim (sendo que eles tem COD_TABELA com PK e FK)
SELECT COD_TABELA FROM TABELA_PRECO WHERE COD_TABELA = (resultado do outro)
eu ate fiz um while e guarde os COD_TABELA em um ListBox ai depois montem uma frase com ele
mais é meio estranho assim se der muitos resultados o sistema vai ficar lerdo
alguém tem alguma soluçao melhor ?????
Link to comment
Share on other sites
7 answers to this question
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.