Ir para conteúdo
Aloysio Coutinho

Múltiplos registros

Recommended Posts

Bom dia pessoAll,

Espero que consiga me explicar.
Tenho uma base de inventário de servidores com múltiplas tabelas voltadas a hardware, bios, rede, discos, memória, cpu, softwares, dentre outras. Preciso criar uma view com todas as informações por servidor.
Estava fazendo múltiplos "selectes" intercalados com JOIN, tipo "select hardware" JOIN "select bios" JOIN "select rede" JOIN "select discos"... e foi aí que me deparei com um problema. Enquanto as tabelas tinham dados únicos e distintos estava indo tudo bem, mas quando um destes JOINs englobou uma tabela com múltiplos registros, como discos por exemplo, os dados das tabelas anteriores se repetiam para cada registro da tabela de múltiplos registros. Imagina quando incluí a tabela de software, onde um servidore terá centenas de softwares instalados. :scream:
Precisava montar um método que reservasse a informação primária (ID do servidor no caso) e buscasse todos os dados deste servidor nas demais tabelas para, ao final da extração de todas estas informações, partir para o ID seguinte.

Será que eu consegui me explicar? :neutral:
Provavelmente tenha que criar uma procedure com um cursor, ou algo do gênero. Alguém poderia me ajudar com isso?

De ante mão agradeço a colaboração.

 

Atenciosamente,

Compartilhar este post


Link para o post
Compartilhar em outros sites

Atualmente, estou fazendo o seguinte (acredito que um método um tanto quanto primário):

 

SELECT


    t.TAG as FUNÇÃO,
    n.SERVIDOR, 
    n.OSNAME as 'SISTEMA OPERACIONAL', 
    n.OSVERSION as 'OS VERSÃO',

    b.SMANUFACTURER as FORNECEDOR, 
    b.SMODEL as MODELO, 
    b.TYPE as TIPO, 
    b.BVERSION as 'VERSÃO BIOS', 
    b.SERIALNUMBER,

    n.IPADDRESS
    c.TYPE as PROCESSADOR, 
    c.PROCESSADORES as QUANTIDADE,
    c.CORES, 
    c.VELOCIDADE, 
    c.FREQUÊNCIA, 
    c.CPUARCH as ARQUITETURA,
    c.L2CACHESIZE as CACHE
,
    m.RAM as MEMÓRIA,
    m.SLOTS,
    m.LIVRES,

    d.DISCO,
    d.TOTAL,
    d.OCUPADO,
    d.LIVRE,
    d.DISPONÍVEL


from 


    (select UPPER(h.NAME) as SERVIDOR, h.OSNAME, h.OSVERSION, n.IPADDRESS, n.HARDWARE_ID
    from hardware h 
    inner join networks n on h.id = n.HARDWARE_ID
    where n.IPADDRESS != '' and n.IPADDRESS not like '%:%'
    group by n.HARDWARE_ID
) n
    
    JOIN
    
    (select TYPE, CORES, SPEED as FREQUÊNCIA, count(SOCKET) as 'PROCESSADORES', HARDWARE_ID, CPUARCH, L2CACHESIZE, CURRENT_SPEED as VELOCIDADE 
    from cpus 
    group by HARDWARE_ID
) c
    
    JOIN
    
    (select replace(format(SUM(capacity),0),',','.') as RAM, HARDWARE_ID, count(NUMSLOTS) as SLOTS, sum(CASE WHEN CAPACITY < 1 THEN 1 ELSE 0 END) as LIVRES
        from memories 
    group by HARDWARE_ID
) m
    
    JOIN
    
    (select HARDWARE_ID, 
    CASE
        WHEN LETTER != '' THEN LETTER
        WHEN LETTER = '' THEN TYPE
    END as DISCO, 
    replace(format(total,0),',','.') as TOTAL, 
    replace(format(free,0),',','.') as LIVRE, 
    CONCAT(REPLACE(CAST((100 - (FREE * 100 / TOTAL)) as DECIMAL(10,2)),'.',','), ' %') as OCUPADO,
    CONCAT(REPLACE(CAST((FREE * 100 / TOTAL) as DECIMAL(10,2)),'.',','), ' %') as DISPONÍVEL
    from drives 
    where TOTAL > 0 and FILESYSTEM != 'overlay'
    group by HARDWARE_ID, LETTER, TYPE
) d
    
    JOIN
    
    (select HARDWARE_ID, TAG
    from accountinfo) t
    
    JOIN
    
    (select HARDWARE_ID, SMANUFACTURER, SMODEL, TYPE, BVERSION, SSN as SERIALNUMBER
    from bios
) b
    
    on  n.HARDWARE_ID = c.HARDWARE_ID 
    and n.HARDWARE_ID = m.HARDWARE_ID
    and n.HARDWARE_ID = d.HARDWARE_ID
    and n.HARDWARE_ID = t.HARDWARE_ID
    and n.HARDWARE_ID = b.HARDWARE_ID
where n.HARDWARE_ID = 8
order by n.SERVIDOR, d.DISCO

Compartilhar este post


Link para o post
Compartilhar em outros sites

Porém, quando me deparei com um servidor com dois discos, como este de ID = 8, o resultado duplicou o registro para cada disco da máquina, C: e D: ficando assim o registro:

 

image.thumb.png.f7566029fe1c1a8649ac896fb364c6e3.png

image.png.c293da322012f1835155a1b1f2548d49.png

 

Imagina quando eu entrar com a tabela de softwares, conforme expliquei no início.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por ronimarcos.silva
      Estou com a seguinte situação: No Mysql eu consegui fazer em  "insert into" de uma única vez, com vários registros, conforme abaixo:
      insert into prefeitos (nome, cidade_id) VALUES ('Rodrigo Neves', 2), ('Caique Rosa Baldran', 9), ('Raquel Lira', 11), ('Maísa Albuquerque Sain', 12), ('Zenaldo Coutinho', null); Porém, no Oracle 12C, usando a mesma forma que no Mysql, está dando o seguinte erro: 
      insert into e080rat (CODEMP, CODSER, SEQRAT, TIPRSC, CRIRAT, NUMPRJ, CODFPJ, CTAFIN, CTARED, PERCTA, CODCCU, PERRAT) values ('800', 'S0001', '279', 'U', '5', '0', '0', '1360', '13730', '100', '31058', '100'), ('800', 'S0001', '280', 'U', '5', '0', '0', '1360', '13730', '100', '31060', '100'), ('800', 'S0001', '281', 'U', '5', '0', '0', '1360', '13730', '100', '31202', '100'), ('800', 'S0001', '282', 'U', '5', '0', '0', '1360', '13730', '100', '31203', '100'); ORA-00933: comando SQL não encerrado adequadamente
      Será que a sintaxe no Oracle é diferente?
       
      Eu sei que assim funciona perfeitamente:
      insert into e080rat (CODEMP, CODSER, SEQRAT, TIPRSC, CRIRAT, NUMPRJ, CODFPJ, CTAFIN, CTARED, PERCTA, CODCCU, PERRAT) values ('800', 'S0001', '279', 'U', '5', '0', '0', '1360', '13730', '100', '31058', '100'); insert into e080rat (CODEMP, CODSER, SEQRAT, TIPRSC, CRIRAT, NUMPRJ, CODFPJ, CTAFIN, CTARED, PERCTA, CODCCU, PERRAT) values ('800', 'S0001', '280', 'U', '5', '0', '0', '1360', '13730', '100', '31060', '100'); insert into e080rat (CODEMP, CODSER, SEQRAT, TIPRSC, CRIRAT, NUMPRJ, CODFPJ, CTAFIN, CTARED, PERCTA, CODCCU, PERRAT) values ('800', 'S0001', '281', 'U', '5', '0', '0', '1360', '13730', '100', '31202', '100'); insert into e080rat (CODEMP, CODSER, SEQRAT, TIPRSC, CRIRAT, NUMPRJ, CODFPJ, CTAFIN, CTARED, PERCTA, CODCCU, PERRAT) values ('800', 'S0001', '282', 'U', '5', '0', '0', '1360', '13730', '100', '31203', '100');  
      Porém, eu tenho uma tabela com quase 100.000 registros e gostaria de fazer em um único "insert". Eu uso o PL/SQLDeveloper e quando faço o "insert" da forma acima, com vários "insert into", ele abre um novo documento para cada "insert into", nisso ele trava, fica horas rodando o "insert" e não conclui se for em um único "insert" como no Mysql, creio que não pesaria tanto.
      Tem uma forma mais fácil de fazer o "insert into" com muitos dados envolvidos?
      Desde já agradeço.
    • Por kenio Junio
      Olá, gostaria de uma ajuda , queria saber como faso para enviar múltiplos registros para o banco de dados de uma só vez com PHP.
      Estou criando um sistema e gostaria de saber como faso para envia de uma só vez vários registros referente ao mesmo id ao invés de enviar 1 por 1.
       
      Obrigado pela atenção fico no aguardo da resposta
×

Informação importante

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