Tentei OUTER JOIN mas não deu, talvez por ser no INSERT

Forum sobre SQL.

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Tentei OUTER JOIN mas não deu, talvez por ser no INSERT

Mensagem por JoséQuintas »

Código: Selecionar todos

CREATE PROCEDURE ze_SenhaAddModule( cModule VARCHAR(60), cModuleOld VARCHAR(60) )

BEGIN

INSERT
INTO JPSENHA
( PWTYPE, PWFIST, PWLAST )
SELECT DISTINCT
'A', PWFIRST, cModule
FROM JPSENHA
WHERE PWTYPE='A' AND PWLAST = cModuleOld
AND NOT EXISTS ( SELECT PWLAST FROM JPSENHA AS B
                 WHERE PWTYPE = 'A' AND B.PWFIRST=JPSENHA.PWFIRST
                 AND PWLAST=cModule );

END
Qual o objetivo?
Vai liberar um módulo (cModule) para TODOS os usuários que tenham acesso a outro modulo (cModuleOld)

SELECT PWFIRST FROM JPSENHA WHERE PWTYPE='A' AND PWLAST=cModuleOld
Isto vai trazer os usuários com acesso ao módulo base

Até aqui tudo bem, iria inserir PWTYPE='A' AND PWFIRST=resultado anterior AND PWLAST=cModule
Mas queria testar se já existe, e só incluir se faltar.
À primeira vista, o comando acima funciona mas... o OUTER JOIN não seria adequado pra isso?
E é tudo encima da mesma tabela, o que atrapalha relacionamento.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Tentei OUTER JOIN mas não deu, talvez por ser no INSERT

Mensagem por JoséQuintas »

Por exemplo, porque este não aceita?
Pra mostrar cadastros sem financeiro.

Código: Selecionar todos

SELECT IDCADASTRO, CDNOME 
FROM jpcadastro
outer join jpfinan on jpcadastro.idcadastro=jpfinan.ficadastro
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
sergiosouzalima
Usuário Nível 1
Usuário Nível 1
Mensagens: 48
Registrado em: 26 Out 2020 11:25
Localização: São Paulo / SP

Tentei OUTER JOIN mas não deu, talvez por ser no INSERT

Mensagem por sergiosouzalima »

Olá, Quintas!

Fiz um teste aqui usando MySql, e usei o LEFT JOIN.

Veja se ajuda.
select.png
left_joint.png

Abraços!
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Tentei OUTER JOIN mas não deu, talvez por ser no INSERT

Mensagem por JoséQuintas »

Obrigado pelo teste.
Tentando entender o OUTER JOIN, que achei que serviria pra isso, pra ser o contrário de INNER JOIN ou LEFT JOIN.

Nota: Outra opção seria usar o COUNT(FICADASTRO) AS QTD e GROUP BY IDCADASTRO HAVING QTD = 0, mas seria processar tudo pra obter a soma
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Tentei OUTER JOIN mas não deu, talvez por ser no INSERT

Mensagem por alxsts »

Olá!
JoséQuintas escreveu:Tentando entender o OUTER JOIN, que achei que serviria pra isso, pra ser o contrário de INNER JOIN ou LEFT JOIN.
Não, este tipo de join não serve para o que você quer. Nada a ver...

SQL Joins

Veja: What is UPSERT and how to do it in MySQL Isto funcionará se suas tabelas possuirem primary keys.


SQL Joins
[]´s
Alexandre Santos (AlxSts)
Responder