Aprenda PL/SQL

Unir 2 consultas

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
  

Mensagemem Ter, 05 Ago 2014 5:25 pm

Boa noite pessoal.

Como posso unir (via CD_PRODUTO) o resultado dessas 2 consultas? De modo que o select resultante conste os campos a.CD_PRODUTO, a.CD_CONTAGEM, SUM(h.QT_ORCAMENTARIO)?

Código: Selecionar todos
SELECT
    a.CD_PRODUTO,
    a.CD_CONTAGEM
FROM
    ITCONTAGEM a
WHERE
    a.CD_CONTAGEM = 6551


Código: Selecionar todos
SELECT
    h.CD_PRODUTO,
    SUM(h.QT_ORCAMENTARIO)
FROM
    COPIA_ESTOQUE h
WHERE
    h.CD_CONTAGEM = 6551
GROUP BY
    h.CD_PRODUTO
marquesjr
Localização: Fortaleza - CE

Mensagemem Qua, 06 Ago 2014 10:51 am

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 :

Código: Selecionar todos
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
stcoutinho
Localização: Sao Paulo - SP

Mensagemem Qua, 06 Ago 2014 1:58 pm

stcoutinho, o meu acesso é somente consulta não tenho privilégios de criar visões.
marquesjr
Localização: Fortaleza - CE

Mensagemem Qua, 06 Ago 2014 2:30 pm

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 "SELECT 1 TOTAL FROM DUAL;"

Você pode fazer a mesma querie de consulta de duas maneiras:

Código: Selecionar todos
SELECT TOTAL FROM VW_DUAL

Código: Selecionar todos
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
stcoutinho
Localização: Sao Paulo - SP

Mensagemem Qua, 06 Ago 2014 2:35 pm

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
stcoutinho
Localização: Sao Paulo - SP

Mensagemem Qua, 06 Ago 2014 3:45 pm

stcoutinho, olhando aqui fiz dessa forma:

Código: Selecionar todos
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
marquesjr
Localização: Fortaleza - CE

Mensagemem Qui, 09 Fev 2017 11:45 am

Consegui utilizando esta sintaxe.

Código: Selecionar todos
SELECT A.*, B.*,C.* FROM (SELECT * FROM DUAL) A,(SELECT * FROM DUAL) B,(SELECT * FROM DUAL) C;
endrigocm



Voltar para SQL

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 3 visitantes