Ir para conteúdo
Fórum Script Brasil
  • 0

Select dentro do outro


danielrgoes

Pergunta

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 para o comentário
Compartilhar em outros sites

7 respostass a esta questão

Posts Recomendados

  • 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 para o comentário
Compartilhar em outros 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

Editado por pimpocvl007
Link para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,7k
×
×
  • Criar Novo...