Inner join ou Left outer?
02/08/2010
0
Estou realizando uma consulta onde o resultado será o seguinte:
Resumidamente!
Usuario, Login, Logout, ini_pausa, fim_pausa
Essas informações estão em tabelas diferentes.
A consulta "funciona" com inner join, mas se o usuário não efetuou pausa (ini_pausa e fim_pausa), ele não é exibido no resultado.
Preciso que esse usuário seja exibido mesmo sem essa informação.
Help! I need somebody, help!
Elton ésqui
Posts
02/08/2010
Tiago Melo
02/08/2010
Elton ésqui
Segue abaixo como as tabelas estão ligadas.
O que preciso: Exibir o resultado mesmo quando só tenha registro na tabela LIG_CAB (campo: INI_OPER).
Ou seja, independente de exisitir ou não a pausa, deverá mostrar o operador que iniciou a operação (INI_OPER)
Obrigado!
Segue o select utilizado:
SELECT
V.CODIGO,
V.NOME,
L.INI_OPER,
L.FIM_OPER,
O.INI_PAUSA,
O.FIM_PAUSA,
M.DESCRICAO AS MOTIV_PAUSAS,
O.DATA AS DATA_PAUSAS,
L.DATA AS DATA_INI_OPER
FROM
VROPERAD V
INNER JOIN OPEPAUSA O ON (V.CODIGO = O.OPERADOR)
INNER JOIN MPAUSA M ON (O.MOTIVO = M.CODIGO)
INNER JOIN LIG_CAB L ON (O.OPERADOR = L.OPERADOR)
WHERE
O.DATA BETWEEN '07/28/2010' AND '08/02/2010' AND
L.DATA BETWEEN '07/28/2010' AND '08/02/2010'
ORDER BY
O.DATA
03/08/2010
Elton ésqui
Se, por exemplo, o cara iniciou a operação ontem, mas não efetuou pausas e iniciou a operação hoje e efetuou pausas, no resultado exibe as pausas de hoje na data de ontem. Estranho!!!
Código Nome Ini. operador Fim operador Iníc.Pausa Fim pausa MOTIV_PAUSAS DATA_PAUSAS DATA_INI_OPER 3.00 Peter Pan 30/07/2010 10:32 30/07/2010 17:36 30/07/2010 10:32 30/07/2010 10:32 BANHEIRO 30/07/2010 00:00 30/07/2010 00:00 3.00 Peter Pan 30/07/2010 10:32 30/07/2010 17:36 30/07/2010 10:32 30/07/2010 10:32 ALMOÇO 30/07/2010 00:00 30/07/2010 00:00 3.00 Peter Pan 03/08/2010 09:27 30/07/2010 17:27 30/07/2010 10:32 30/07/2010 10:32 BANHEIRO 30/07/2010 00:00 03/08/2010 00:00 3.00 Peter Pan 03/08/2010 09:27 30/07/2010 17:27 30/07/2010 10:32 30/07/2010 10:32 ALMOÇO 30/07/2010 00:00 03/08/2010 00:00
05/08/2010
Emerson Nascimento
SELECT
V.CODIGO,
V.NOME,
L.INI_OPER,
L.FIM_OPER,
O.INI_PAUSA,
O.FIM_PAUSA,
M.DESCRICAO AS MOTIV_PAUSAS,
O.DATA AS DATA_PAUSAS,
L.DATA AS DATA_INI_OPER
FROM
VROPERAD V
INNER JOIN LIG_CAB L ON (L.OPERADOR = O.OPERADOR)
LEFT JOIN OPEPAUSA O ON (O.OPERADOR = V.CODIGO and O.DATA = L.DATA)
LEFT JOIN MPAUSA M ON (M.CODIGO = O.MOTIVO)
WHERE
L.DATA BETWEEN '07/28/2010' AND '08/02/2010'
ORDER BY
L.DATA
10/08/2010
Elton ésqui
Não é possível criar expressão de JOIN direito para esta consulta.
10/08/2010
Elton ésqui
SELECT
V.CODIGO,
V.NOME,
L.INI_OPER,
L.FIM_OPER,
O.INI_PAUSA,
O.FIM_PAUSA,
M.DESCRICAO AS MOTIV_PAUSAS,
O.DATA AS DATA_PAUSAS,
L.DATA AS DATA_INI_OPER
FROM
OPEPAUSA O
FULL OUTER JOIN LIG_CAB L ON (L.OPERADOR = O.OPERADOR)
AND (O.DATA = L.DATA)
LEFT OUTER JOIN VROPERAD V ON (O.OPERADOR = V.CODIGO)
LEFT OUTER JOIN MPAUSA M ON (M.CODIGO = O.MOTIVO)
WHERE
L.DATA BETWEEN '07/28/2010' AND '08/02/2010'
ORDER BY
L.DATA
Estou testando ainda!!!
10/08/2010
Elton ésqui
Quando o operador não tem pausas, no resultado não exibe o código e nome dele.
SELECT
V.CODIGO,
V.NOME,
L.INI_OPER,
L.FIM_OPER,
O.INI_PAUSA,
O.FIM_PAUSA,
M.DESCRICAO AS MOTIV_PAUSAS,
O.DATA AS DATA_PAUSAS,
L.DATA AS DATA_INI_OPER
FROM
VROPERAD V
LEFT OUTER JOIN OPEPAUSA O ON (O.OPERADOR = V.CODIGO)
FULL OUTER JOIN LIG_CAB L ON (L.DATA = O.DATA)
AND (L.OPERADOR = V.CODIGO)
LEFT OUTER JOIN MPAUSA M ON (M.CODIGO = O.MOTIVO)
WHERE
L.DATA BETWEEN '08/06/2010' AND '08/10/2010'
ORDER BY
L.DATA,
V.NOME
10/08/2010
Emerson Nascimento
V.CODIGO,
V.NOME,
L.INI_OPER,
L.FIM_OPER,
O.INI_PAUSA,
O.FIM_PAUSA,
M.DESCRICAO AS MOTIV_PAUSAS,
O.DATA AS DATA_PAUSAS,
L.DATA AS DATA_INI_OPER
FROM
LIG_CAB L
INNER JOIN
VROPERAD V ON (V.CODIGO = L.OPERADOR)
LEFT JOIN
OPEPAUSA O ON (O.OPERADOR = L.OPERADOR and O.DATA = L.DATA)
LEFT JOIN
MPAUSA M ON (M.CODIGO = O.MOTIVO)
WHERE
L.DATA BETWEEN '07/28/2010' AND '08/02/2010'
ORDER BY
L.DATA
10/08/2010
Elton ésqui
Esse exclui o que não tem pausa...mas eu preciso exibir pelo menos se iniciou a operação!
10/08/2010
Elton ésqui
Dessa maneira funcionou sim!!! Ótimo!
Muitíssimo obrigado!
Elton
PS: Responda para eu fechar o tópico com feedback.
Valeu
10/08/2010
Emerson Nascimento
V.CODIGO,
V.NOME,
L.INI_OPER,
L.FIM_OPER,
O.INI_PAUSA,
O.FIM_PAUSA,
M.DESCRICAO AS MOTIV_PAUSAS,
O.DATA AS DATA_PAUSAS,
L.DATA AS DATA_INI_OPER
FROM
LIG_CAB L
INNER JOIN
VROPERAD V ON (V.CODIGO = L.OPERADOR)
LEFT JOIN
OPEPAUSA O ON (O.OPERADOR = L.OPERADOR and O.DATA = L.DATA)
LEFT JOIN
MPAUSA M ON (M.CODIGO = O.MOTIVO)
WHERE
L.DATA BETWEEN '07/28/2010' AND '08/02/2010'
ORDER BY
L.DATA
eu estava achando estranho não funcionar dessa maneira. o importante é que o problema foi resolvido.
Clique aqui para fazer login e interagir na Comunidade :)