Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Regis Oliver

"Select" entre 3 tabelas

Recommended Posts

Oi galera.

Estou tentando fazer um Select e estou apanhando um pouco.

Seguinte:

Tabelas: dry_os_item || dry_produto || dry_servico

Gostaria de trazer quase todas as informações da tabela "DRY_OS_ITEM", mas na Descrição do ITEM, buscar a descrição no produto, se for um produto, ou a Descrição do serviço, se for um Serviço. Isso usando o mesmo CAMPO.

Vou colocar as tabelas pra entender melhor.

DRY_OS_ITEM

OS_ITEM_ID	OS_ID	PRODUTO_ID	PRODUTO_VALOR	QUANTIDADE	OS_ITEM_TOTAL	OS_ITEM_DATA	OS_ITEM_TAG
15		8		4		1.55		2		454.65		-	produto
17		8		4		150		2		454.65		-	servico

DRY_PRODUTO:

produto_id

produto_descricao

produto_tag

 

DRY_SERVICO

servico_id

servico_descricao

servico_tag

 

Eu fiz o seguinte Select:

select oi.os_item_id,
       oi.os_id,
       oi.produto_id,
       pi.produto_descricao || se.servico_descricao as Produto,
       oi.produto_valor,
       oi.quantidade,
       (oi.produto_valor * oi.quantidade) total
from dry_os_item oi, dry_produto pi, dry_servico se
where oi.OS_ID = 8

Resultado:

OS_ITEM_ID	OS_ID	PRODUTO_ID	PRODUTO							PRODUTO_VALOR	QUANTIDADE	TOTAL
15		8	4		Cerveja Skol - LataEspelhamento Carro Esportivo		1.55		2		3.1
16		8	4		Cerveja Skol - LataEspelhamento Carro Esportivo		1.55		1		1.55
17		8	4		Cerveja Skol - LataEspelhamento Carro Esportivo		150		2		300
18		8	4		Cerveja Skol - LataEspelhamento Carro Esportivo		150		1		150

Note que o PRODUTO esta trazendo as duas descrições, do serviço e do produto. Claro que esse select eu fiz para ilustrar a dúvida.

Tentei várias condições no WHERE, INNER JOIN, OUTER JOIN, IF EXISTS, etc etc e sem sucesso.

Desculpe pela dúvida ser um pouco tonta, mas ja nao sei o que fazer.

Se alguém puder me ajudar, por favor

Agradeço desde já.

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

"se for um produto, ou a Descrição do serviço "

 

são excludentes ? um ou outro ?

 

Em tese

 

select oi.os_item_id,
       oi.os_id,
       oi.produto_id,
       pi.produto_descricao || se.servico_descricao as Produto,
       oi.produto_valor,
       oi.quantidade,
       (oi.produto_valor * oi.quantidade) total
from dry_os_item oi, dry_produto pi, dry_servico se
where oi.OS_ID = 8
and oi.PRODUTO_ID = pi.PRODUTO_ID
and oi.OS_ID = se.OS_ID

deve resolver

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isso Motta. um ou outro!

Eu queria uma forma de aparecer só a descrição do Produto, se for um produto ou só a descrição do Serviço se for um serviço.

A tabela DRY_OS_ITEM só guarda o ID do serviço/produto e a TAG deles (Servico ou Produto).

 

Em 13/04/2017 at 17:32, Motta disse:

and oi.OS_ID = se.OS_ID

 

Essa condição está errada. Não tem o ID da OS na tabela Serviço.

Mas, obrigado pela ajuda Motta.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como se sabe se é um produto ou serviço ?

Em que tabela/coluna tem o código de serviço

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então.

Olhando pra tabela dry_os_item tem a coluna os_item_tag. Nessa coluna da pra saber se é um "Produto" ou um "Servico"

Deixei um exemplo da tabela com 2 itens inseridos com o mesmo id do produto > "produto_id".

 

Agora eu não sei como fazer um Select pra trazer certo a descrição de cada um.

Se alguém tiver alguma ideia, ou talvez, criar um campo a mais nas tabelas pra ajudar no "where"..

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se OS_ITEM_TAG = 'produto'
  Então Pesquisa DRY_PRODUTO por PRODUTO_ID
senão
   Se OS_ITEM_TAG = 'servico'
      Então Pesquisa DRY_SERVICO por OS_ID

 

Isto ?

Compartilhar este post


Link para o post
Compartilhar em outros sites
2 minutos atrás, Motta disse:

Se OS_ITEM_TAG = 'produto'
  Então Pesquisa DRY_PRODUTO por PRODUTO_ID
senão
   Se OS_ITEM_TAG = 'servico'
      Então Pesquisa DRY_SERVICO por OS_ID

 

Isto ?

 

É isso. Só que na parte do serviço seria: "Então Pesquisa DRY_SERVICO por SERVICO_ID."

 

Em 13/04/2017 at 16:31, Regis Oliver disse:

pi.produto_descricao || se.servico_descricao as Produto,

 

Eu quero que ele traga como nessa linha acima, por exemplo. Trazer um ou o outro.

Esta meio confuso ainda ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não , vejo duas saídas

 

1) Uma function que receberia tag e id por parametro e

pesquisaria pela tabela produto_id ou servico_id conforme o tag e retornaria o nome do produto ou serviço

 

2) criar uma view

create view v_serv_prod as
select produto_id, produto_descricao, produto_tag from DRY_PRODUTO
union all
select servico_id ,servico_descricao, servico_tag from DRY_SERVICO 

faça o join nesta view unindo

por tag

 

select oi.os_item_id,
       oi.os_id,
       oi.produto_id,
       pi.produto_descricao || se.servico_descricao as Produto,
       oi.produto_valor,
       oi.quantidade,
       (oi.produto_valor * oi.quantidade) total
from dry_os_item oi, v_serv_prod v
where oi.OS_ID = 8
and (case when io.tag = 'produto' then PRODUTO_ID else OS_ID end0 = v.produto_id
and  io.tag = v.tag

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Salve Motta..

 

Eu criei a view, como você sugeriu.

Mas eu não entendi direito as condições que você colocou no "where"

18 horas atrás, Motta disse:

and (case when io.tag = 'produto' then PRODUTO_ID else OS_ID end0 = v.produto_id and io.tag = v.tag

Essa parte Acima "io.tag" está certo ? não seria "oi.os_item_tag" ?

 

Eu fiz as seguintes alterações abaixo.

E da o seguinte erro: ORA-06550: line 16, column 7: ORA-00942: table or view does not exist

from dry_os_item oi, v_serv_prod v
where oi.OS_ID = 8
and (case when oi.os_item_tag = 'produto' then PRODUTO_ID else SERVICO_ID end = v.produto_id)
and oi.os_item_tag = v.servico_tag

O que esta errado ??? Ele não esta encontrando a view ?

 

Obrigado Motta.

Compartilhar este post


Link para o post
Compartilhar em outros sites

ORA-00942: table or view does not exist 

 

a view com este nome não existe ou está em outro owner (user) de onde a sql está sendo executada

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Resolvi o problema fazendo o seguinte código:

select
       oi.os_id,
       oi.produto_id,
       (case when oi.os_item_tag = 'produto' then pi.produto_descricao
            else se.servico_descricao end) as Produto,
       oi.produto_valor,
       oi.quantidade
from dry_os_item oi, dry_produto pi, dry_servico se
where oi.OS_ID = :P43_ORDER_ID

Simples, mas não conseguia enxergar.

Agradeço a ajuda de todos.

Deixei o código, talvez ajude.

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu achei que tinha resolvido o problema.

Mas quando fui fazendo mais testes, ainda esta trazendo informações erradas.

Esta duplicando os produtos e também percebi que ele trouxe outro nome do produto. Segue o retorno do Select acima:

OS_ID  PRODUTO_ID PRODUTO PRODUTO_VALOR     QUANTIDADE
9 5 Cerveja Brahma - Lata 2.19     1
9 5 Cerveja Skol - Lata 2.19     1
9 4 Espelhamento Carro Esportivo   150     1
9 4 Espelhamento Carro Esportivo 150     1

 

vou deixar abaixo o retorno do select da tabela Dry_os_item com o OS_ID = 9 (Obs: tem somente 2 itens no banco)

select * from dry_os_item where os_id = 9

OS_ITEM_ID  OS_ID  PRODUTO_ID  PRODUTO_VALOR  QUANTIDADE  OS_ITEM_TOTAL  OS_ITEM_DATA  OS_ITEM_TAG   
19 9 5 2.19 1 152.19 - produto  
20 9 4 150 1 152.19 - servico  

 

Alguém me dê uma luz, por favor

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Usei o DISTINCT e mesmo assim ele ainda trazia outro item, que nem esta na tabela Dry_os_item.

Eu mudei um pouco o select:

select DISTINCT
       oi.os_item_id editlink,
       oi.os_item_id,
       oi.os_id,
       oi.produto_id,
       (select produto_descricao from dry_produto where produto_id = oi.produto_id and oi.os_item_tag = 'produto') as Produto,
       (select servico_descricao from dry_servico where servico_id = oi.produto_id and oi.os_item_tag = 'servico') as Serviço,
       oi.produto_valor,
       oi.quantidade,
       (oi.produto_valor * oi.quantidade) extended_price,
       dbms_lob.getlength(produto_imagem) produto_imagem ,
decode(nvl(dbms_lob.getlength(pi.produto_imagem),0),0,null,
    '<img style="border: 4px solid #CCC; -moz-border-radius: 4px; -webkit-border-radius: 4px;" '||
    'src="'||
    apex_util.get_blob_file_src('P29_PRODUTO_IMAGEM',pi.produto_id)||
    '" height="75" width="75" alt="Produto Imagem" title="Produto Imagem" />')
    detail_img
from dry_os_item oi, dry_produto pi
where oi.os_id = 10

Deixei ate o distinct.. eu tinha feito com Group by, mas mesmo assim retorna a mesma coisa:

EDITLINK	OS_ITEM_ID	OS_ID	PRODUTO_ID	PRODUTO			SERVIÇO		PRODUTO_VALOR	QUANTIDADE	EXTENDED_PRICE	PRODUTO_IMAGEM	DETAIL_IMG
21		21		10	4		Cerveja Skol - Lata	-		1.55		1		1.55		-		-
21		21		10	4		Cerveja Skol - Lata	-		1.55		1		1.55		8435		< Exemplo: imagem />

não sei porque ele traz esse item de cima, era pra vir somente o que tem imagem..

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por ILR master
      Boa tarde, pessoal.
      Espero que todos estejam bem.
       
      Seguinte:
      Tenho a seguinte consulta:
       
      $usuarios= "SELECT * FROM usuarios";
      $query= mysqli_query($conexao, $usuarios) or die ("Usuário não encontrado");
      $usuario = mysqli_fetch_array($query);
       
      Quero pegar apenas o campo 'nome' da tabela 'usuarios' e colocar todos os resultados da seguinte forma:
       
      $nomes = array("Rafael", "João", "Maria", "Pedro", "Patricia", "Camila");
       
      Agradeço desde já.
      Abs
       
       
    • Por FabianoSouza
      Eu preciso exibir duas informações em minha consulta:
      1) A quantidade de pessoas inscritas numa turma de treinamento (isso é feito com um simples COUNT)
      2) Uma flag de excesso de inscrições na turma. Seria obtido pela comparação entre a quantidade máxima permitida (já existe esse campo) e o COUNT feito acima.
       
      Até aqui sem problemas.
       
      O que quero é evitar fazer duas contagens (1 para saber a quantidade de inscritos, e outra para gerar a flag de excesso de inscrições).
       
      Há uma forma de utilizar UMA contagem para atender as duas necessidades?
       
      Meu código está assim:
       
      ... --AQUI FAZ A COMPARAÇÃO PARA GERAR A FLAG DE EXCESSO DE INSCRIÇÕES , CASE WHEN (SELECT COUNT(*) FROM dbo.tab AS ITT WHERE ITT.codTurmaDeTreina = T.id) > T.lotacaoMax Then T.nome + '&nbsp;'+'<span class=%22icon-aviso fcolor-critico%22 style=%22font-size:18px%22 title=Excesso&nbsp;de&nbsp;inscrições></span>' --AQUI FAZ A CONTAGEM DE INSCRIÇÕES , (SELECT COUNT(*) FROM dbo.tab AS ITT WHERE ITT.codTurmaDeTreina = T.id) AS 'Inscrições'  
    • Por FabianoSouza
      Possuo uma coluna de data.
      Eu gostaria que os registros com datas futuras aparecessem no topo do meu select, em relação aos demais registros.
      Em seguida, gostaria que somente esses registros com datas futuras ficassem em ordem crescente.
      Algo como 
       
      João  | 16/11/2023
      Maria | 17/11/2023
      José  |  20/11/2023
       
      -----------------------------
      (demais registros da base)
      Antônio   |  20/05/2023
      Rosa        | 15/08/2023
      Cida         | 15/10/2022
      Pedro      |  20/05/2021
      Paulo      |  14/11/2020
       
      O select seria esse.
      select dbo.formataData(ET.dataInicial) AS 'data' FROM dbo.tab AS ET GROUP BY ET.dataInicial  
    • Por FabianoSouza
      Tenho uma function que precisa receber 02 argumentos.
      Ela funciona se eu aplicar num select qualquer. Mas se eu aplicar num select dinâmico, ocorre erro.
      Veja trecho do meu select.
      ... SET @sql = @sql +', dbo.retornaIco_ItemBloq((SELECT COUNT(*) FROM dbo.tab AS TT2 WHERE TT2.codCategTreina = CTT.id),'+@title+') AS ''resp''' ... No caso, o primeiro argumento da function dbo.retornaIco_ItemBloq é um SELECT COUNT.
      O segundo argumento é uma variável (que está devidamente declarada e definida).
       
      O erro ocorre porque ao executar (chamando EXEC(@sql) ), o SQL entende que o segundo argumento é uma coluna da consulta principal, pois existe uma vírgula antes da variável @title (que é o segundo argumento da function).
      Repito. Se eu aplicar essa function num select normal, funciona normalmente. Porém, preciso que funcione num SQL dinâmico porque é esse é o padrão que estou adotando para o sistema todo.
       
      A function dbo.retornaIco_ItemBloq faz o seguinte:
      1) Recebe o valor do COUNT e da variável @title
      2) Se o COUNT for maior que  Zero, cria uma tag HTML (uma SPAN), define sua title com o valor da variável @title e passa para uma variável
      3) Retorna o HTML que será exibido no resultado da consulta principal
      É super simples.
       
      Há outra forma de chamar a function?
    • Por mateus.andriollo
      Existe uma forma de fazer um IF na select e comparar com Array de dados?
       
      algo como
       
      Select if( in_array(idCliente,'1,2,3,4,5')=true,'Tem','Não') ) as cliente Não consigo usar inner ou where pois esse array é algo q tem varias regras...
       
      Precisava saber se existe uma função assim em MySQL
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.