Jump to content
Fórum Script Brasil
  • 0

Select dentro do outro


danielrgoes

Question

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

  • 0
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 ?????

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.

Link to comment
Share on other sites

  • 0

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 by pimpocvl007
Link to comment
Share on other sites

  • 0

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 I

WHERE 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 é?!

Link to comment
Share on other sites

  • 0
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 I

WHERE 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 Expert

POrem 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 ensinou

que como você disse usa itens de 2 tabelas diferentes,

Ah e realmente o (2) não é fixo foi so para exemplificar

Link to comment
Share on other sites

  • 0
SQL, CDS, DSP e DS ligado em uma tabela especifica, como vou usar o select que você me ensinou

que 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?

Link to comment
Share on other sites

  • 0
SQL, CDS, DSP e DS ligado em uma tabela especifica, como vou usar o select que você me ensinou

que 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 assim

sql := '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_COMPRA

ai o componente traz todos os campos da minha tabela

ai 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 ???

Link to comment
Share on other sites

  • 0

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.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.2k
    • Total Posts
      652k
×
×
  • Create New...