Unir 2 consultas

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
marquesjr
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 77
Registrado em: Qua, 05 Dez 2007 10:51 am
Localização: Fortaleza - CE

Boa noite pessoal.

Como posso unir (via CD_PRODUTO) o resultado dessas 2 consultas? De modo que o select resultante conste os campos ?

Selecionar tudo

a.CD_PRODUTO, a.CD_CONTAGEM, SUM(h.QT_ORCAMENTARIO)

Selecionar tudo

SELECT
    a.CD_PRODUTO,
    a.CD_CONTAGEM
FROM
    ITCONTAGEM a
WHERE
    a.CD_CONTAGEM = 6551

Selecionar tudo

SELECT
    h.CD_PRODUTO,
    SUM(h.QT_ORCAMENTARIO)
FROM
    COPIA_ESTOQUE h
WHERE
    h.CD_CONTAGEM = 6551
GROUP BY
    h.CD_PRODUTO
Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

Olá marquesjr,

Pelo que entendi, o que você precisa mesmo fazer é relacionar as duas consultas (e não unir).

No SQL, você pode tratar estas duas queries como se fossem "views" .. e fazer SELECT e JOINS com as mesmas.

Você poderia fazer algo como :

Selecionar tudo

padrão "SQL antigo":

SELECT <colunas>
  FROM  (<primeira querie>) A,
        (<segunda querie>) B
 WHERE  <condicoes>

NOVO padrão "ANSI":

SELECT <colunas>
  FROM  (<primeira querie>) A
   JOIN (<segunda querie>) B
     ON (<condicoes>)


Só que você precisa tomar alguns cuidados:

A) Colunas com AVG, COUNT, SUM, etc precisam ter um alias/cabeçalho associado
B) As duas queries que você levantou .. elas retornam exatamente a mesma quantidade de produtos? Se não retornarem, você precisa avaliar se pelo menos uma delas apresenta TODOS os produtos e usar um OUTER JOIN (que poderia ser um LEFT OUTER JOIN ou um RIGHT OUTER JOIN - "no padrão ansi" - ou o uso de (+) na antigo padrão oracle)
C) Se NENHUMA das duas queries apresentam todos os produtos e você precisa de uma relação completa, talvez você tenha que adicionar uma terceira tabela (ex: produtos) na sua querie.

Abraços,

Sergio Coutinho
marquesjr
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 77
Registrado em: Qua, 05 Dez 2007 10:51 am
Localização: Fortaleza - CE

stcoutinho, o meu acesso é somente consulta não tenho privilégios de criar visões.
Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

Olá Marquesjr,

Na verdade, você não precisa criar nenhuma view.

O que eu estou tentando explicar é que você pode usar sub-queries como se fossem "views".

Exemplo: se você tem uma view de nome "VW_DUAL" cuja querie seria

Selecionar tudo

SELECT 1 TOTAL FROM DUAL;
Você pode fazer a mesma querie de consulta de duas maneiras:

Selecionar tudo

SELECT TOTAL FROM VW_DUAL

Selecionar tudo

SELECT TOTAL FROM (SELECT 1 TOTAL FROM DUAL);
Observe que na "segunda opção" não estou usando a "view" e sim uma "sub-querie".

Suas queries que você postou aqui podem ser consultadas da mesma forma. Coloque ela entre parênteses, coloque alias/apelidos nelas e monte um SQL que façam JOIN entre estes dois resultados.

Pesquise um pouco mais sobre SUB-QUERIES e como aplicar a mesma no SQL. Como disse na explicação anterior, você consegue resolver tudo em uma querie, e sem necessidade de criar VIEWS ou outros objetos.

Abraços,

Sergio
Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

Olá Marquesjr,

Pesquisei um pouco mais e o termo correto seria "IN-LINE VIEW".
Mas não se trata de uma VIEW como a que nós costumamos criar no banco de dados.
Veja se este link esclarece um pouco sua dúvida: http://www.orafaq.com/wiki/Inline_view

Abraços,

Sergio
marquesjr
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 77
Registrado em: Qua, 05 Dez 2007 10:51 am
Localização: Fortaleza - CE

stcoutinho, olhando aqui fiz dessa forma:

Selecionar tudo

SELECT
    CONTAGEM,
    PRODUTO,
    SUM(QT_ESTOQUE)   AS QT_APOS,
    SUM(QT_ORCAMENTO) AS QT_ANTERIOR
FROM
    (
        SELECT
            a.CD_CONTAGEM    CONTAGEM,
            a.CD_PRODUTO     PRODUTO,
            SUM(a.QT_ESTOQUE)QT_ESTOQUE,
            NULL             QT_ORCAMENTO
        FROM
            ITCONTAGEM a
        WHERE
            a.CD_CONTAGEM = 6551
        GROUP BY
            a.CD_CONTAGEM,
            a.CD_PRODUTO,
            a.QT_ESTOQUE
        UNION
        SELECT
            h.cd_contagem          CONTAGEM,
            h.CD_PRODUTO           PRODUTO,
            NULL                   QT_ESTOQUE,
            SUM(h.QT_ORCAMENTARIO) QT_ORCAMENTO
        FROM
            COPIA_ESTOQUE h
        WHERE
            h.CD_CONTAGEM = 6551
        GROUP BY
            h.cd_contagem,
            h.CD_PRODUTO,
            h.QT_ORCAMENTARIO)
GROUP BY
    CONTAGEM,
    PRODUTO
endrigocm
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 1
Registrado em: Qui, 09 Fev 2017 9:13 am

Consegui utilizando esta sintaxe.

Selecionar tudo

SELECT A.*, B.*,C.* FROM (SELECT * FROM DUAL) A,(SELECT * FROM DUAL) B,(SELECT * FROM DUAL) C;
Responder
  • Informação