Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Walsan

Consulta duplicada no banco de dados SQLServer

Recommended Posts

Olá pessoal!

Preciso de uma ajuda em um SELECT no banco de dados (SQL SERVER).
Segue abaixo 4 tabelas do banco de dados de uma imobiliária que aluga kitnets (moradias).

CREATE TABLE tblImovel (
imov_id INT IDENTITY(1,1),
tpim_id INT FOREIGN KEY REFERENCES tblTipoImovel(tpim_id),
dest_id INT FOREIGN KEY REFERENCES tblDestinacaoImovel(dest_id),
prop_id INT FOREIGN KEY REFERENCES tblProprietario(prop_id),
imov_codigo VARCHAR(30),
imov_endereco VARCHAR(50),
imov_cep VARCHAR(10),
imov_numero VARCHAR(10),
imov_bairro VARCHAR(30),
imov_cidade VARCHAR(30),
imov_estado CHAR(2),
imov_valor MONEY,
imov_iptu MONEY,
imov_pavimentosTotal INT,
imov_dormitorios INT,
imov_dormitoriosComp INT,
imov_banheiros INT,
imov_banheirosComp INT,
imov_suites INT,
imov_kitnets INT,
imov_cozinhas INT,
imov_cozinhasComp INT,
imov_areaServ INT,
imov_areaServComp INT,
imov_quintal INT,
imov_varanda INT,
imov_salao INT,
imov_garagem INT,
imov_dimensTerreno REAL,
imov_dimensAreaConst REAL,
imov_dimensFachada REAL,
imov_norteGeog VARCHAR(100),
imov_observacao VARCHAR(1000), 
imov_viasAcesso VARCHAR(1000),
imov_situacao VARCHAR(10),
CONSTRAINT tblImovel_PK PRIMARY KEY(imov_id)
)
GO

CREATE TABLE tblMoradia(
morad_id INT IDENTITY(1,1),
imov_id INT FOREIGN KEY REFERENCES tblImovel(imov_id),
morad_numero VARCHAR(10),
morad_valor MONEY,
morad_dimensaoTotal REAL,
morad_suite INT,
morad_suitePia INT,
morad_banheiro INT,
morad_banheiroComp INT,
morad_cozinha INT,
morad_cozinhaComp INT,
morad_quarto INT,
morad_quartoComp INT,
morad_areaServ INT,
morad_areaServComp INT, 
morad_descricao VARCHAR(1000),
morad_situacao VARCHAR(10),
morad_pavimento INT,
CONSTRAINT tblMoradia_PK PRIMARY KEY(morad_id)
)
GO

CREATE TABLE tblMorador(
mora_id INT IDENTITY(1,1),
mora_nome VARCHAR(50),
mora_cpf VARCHAR(12),
mora_rg VARCHAR(20),
mora_profissao VARCHAR(30),
mora_dataNasc DATE ,
mora_telefone VARCHAR(20),
mora_celular VARCHAR(20),
mora_email VARCHAR(50),
mora_observacao VARCHAR(1000),
mora_situacao VARCHAR(10),
CONSTRAINT tblMorador_PK PRIMARY KEY(mora_id)
)
GO


CREATE TABLE tblContrato(
cont_id INT IDENTITY(1,1),
fiad_id INT FOREIGN KEY REFERENCES tblFiador(fiad_id),
prop_id INT FOREIGN KEY REFERENCES tblProprietario(prop_id),
imov_id INT FOREIGN KEY REFERENCES tblImovel(imov_id),
mora_id INT FOREIGN KEY REFERENCES tblMorador(mora_id),
morad_id INT FOREIGN KEY REFERENCES tblMoradia(morad_id),
cont_valor MONEY,
cont_diaVenc INT,
cont_deposito INT,
cont_dataInicio DATE,
cont_dataFim DATE,
cont_habitantes INT,
cont_observacao VARCHAR(512),
cont_situacao VARCHAR(10),
CONSTRAINT tblContrato_PK PRIMARY KEY(cont_id)
)
GO

Inseri um contrato para um determinado morador, em um determinado imóvel e uma moradia atualizando assim o campo situação na tabela tblMoradia para ''OCUPADO'' e o campo situação da tabela tblContrato para ''VIGENTE''. Logo depois esse morador desistiu do contrato e saiu da casa. Dessa forma, eu cancelei o contrato no sistema atualizando a situação da moradia para ''DESOCUPADO'' e a situação do contrato para ''CANCELADO''. Tempos depois um novo morador decide morar nessa mesma moradia e um novo contrato é feito atualizando novamente a situação da tblMoradia para ''OCUPADO''. Por fim, esse novo morador também decide sair da casa cancelando novamente o contrato e atualizando a situação da tblMoradia para ''DESOCUPADO'' e a tblContrato para ''CANCELADO''. 

Portanto, gerei dois registro para uma mesma moradia, em dois contratos diferentes. 
Gostaria de realizar uma consulta no banco que retornasse somente as moradias (kitnets) disponíveis independente do histórico anterior, ou seja, não quero que ele traga valores repetidos. Entretanto quando realizo a seguinte consulta no banco:

SELECT i.imov_codigo, mo.mora_nome, m.morad_numero, m.morad_pavimento, m.morad_dimensaoTotal, c.cont_valor, i.imov_observacao, i.imov_viasAcesso, 
m.morad_suite, m.morad_suitePia, m.morad_banheiro, m.morad_banheiroComp, m.morad_cozinha, m.morad_cozinhaComp, m.morad_quarto, 
m.morad_quartoComp, m.morad_areaServ, m.morad_areaServComp, m.morad_descricao, m.morad_situacao, c.cont_situacao 
FROM tblMoradia m FULL OUTER JOIN tblImovel i 
ON m.imov_id=i.imov_id FULL OUTER JOIN tblContrato c
ON c.morad_id=m.morad_id FULL OUTER JOIN tblMorador mo
ON mo.mora_id=c.mora_id
WHERE i.imov_codigo=@cod AND m.morad_situacao=@situacao

em que @cod equivale ao código do imóvel alugado e @situacao=''DESOCUPADO'' ele retorna todas moradias desocupadas e para a moradia que foi alugada mais de uma vez, ele traz todos os registos gerados (no exemplo citado, são ao todo 2 registros). Entretanto eu preciso consultar somente as moradias desocupadas independente do número de registros gerados. Não quero que os registros se repitam.

Espero que tenha sido claro. Desde já agradeço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por mr22robot
      Ola caros amigos. 
      Estou com uma dúvida aqui que embora nao tenho achado ainda uma resposta, acredito que haja.
      Estou estudando a tão sonhada linguagem de programação asp.net core mvc. Linguagem essa que demorei 5 anos pra iniciar os estudos rsrs.
      Mas estou agarrado em uma situação. 
      Estou usando como base de dados nos meus estudos um banco Oracle. Que já tem algumas informações nele. Utilizei o SCAFFOLD para criar as classes e o contexto baseado no banco e tabelas existentes. 
      Porem agora na fase das consultas, estou perdido em como utilizar o IN que eu utilizo no oracle; no LINQ.
      Ex: 
      SELECT CODPROD,DESCRICAO FROM PRODUTO WHERE CODPROD IN(1,2,3,4,5,6) Como eu utilizo esse filtro com uma restrição de códigos de produtos? no caso o where codprod in(1,2,3,4,5,6) ?.
      Desde já obrigado pela ajuda.
    • Por luis0101010
      1.      Programe uma função que recebe um número inteiro e verifica se todos os dígitos deste número são iguais ou diferente e liste eles em ordens crescentes.
      Obs: Código fonte com no mínimo de 10 dígitos.
       
      Como exemplo, os números 456, −235, e 5 satisfazem esta condição, enquanto que o número 6 não.
       
      2.      Crie também a função main que recebe o valor do número digitado pelo usuário e exibe na tela uma mensagem informando se os dígitos deste número são iguais.
       
      Exemplo:
      --Exemplo 1:
      Informe um número:
      -555
      Numero informado possui todos os dígitos iguais
      --Exemplo 2:
      Informe um número:
      67
      Número informado não possui todos os dígitos iguais
    • Por TheLord23
      ESTOU COMEÇANDO AGORA NA PROGRAMAÇÃO COM VISUALG E TERIA QUE COLOCAR ESTE CODIGO EM UM LAÇO DE REPETIÇÃO.
      POREM NÃO ESTOU CONSEGUINDO PODERIAM ME AJUDAR ?
       
      SÓ PENSANDO QUE O USUÁRIO IRA DIGITAR O TAMANHO DO VETOR, APOS ISSO CADA OPÇÃO QUE ELE ESCOLHER E ELA SER EXECUTADA DE FORMA CORRETA ELE VOLTARA PARA O MEUNU PRINCIPAL DAS OPÇÕES ATE QUE ELE SELECIONE A OPÇÃO "F"
       
      POREM TENTEI ESCREVELO USANDO ENQUANTO MAS ACABOU QUE EU NÃO CONSIGO PREVINIR OS ERROS DO USUÁRIO QUANDO ELE COLOCA AS INFORMAÇÕES
       
      TIPO:
      -ARMAZENAR UM NÚMERO NO VETOR E ESSE NÚMERO NÃO SER SOBRESCREVIDO ATE QUE O PROGRAMA SEJA ENCERRADO
      -SE ELE DIGITAR PRA BUSCAR OU INSERIR O NÚMERO ZERO O PROGRAMA INFORMAR QUE O VALOR É INVÁLIDO
       
      TENTEI USAR PROCEDIMENTOS E FUNÇÕES MAS OS ERROS CONTINUARAM.
       
       
       
      Algoritmo "DESAFIO"
      Var
         AUX,CONTADOR,BUSCAR:INTEIRO
         POSICAO,AUX_TEMP:INTEIRO
         OPCAO:CARACTERE
         RESULT_BUSCA: LOGICO
         SOMA_VET:REAL
         NUMERO:VETOR[1..500]DE INTEIRO
      Inicio
         ESCREVAL("*********************************")
         ESCREVAL("* CADASTRO DE VETORES - DESAFIO *")
         ESCREVAL("*********************************")
         ESCREVA("DIGITE O TAMANHO DO VETOR A SER CADASTRADO: ")
         LEIA(AUX)
         NUMERO[AUX] <- AUX
         ESCREVAL("A - Cadastrar um novo número;")
         ESCREVAL("B - Buscar um número")
         ESCREVAL("C - Excluir um número;")
         ESCREVAL("D - Listar os números cadastrados;")
         ESCREVAL("E - Exibir a soma dos números do vetor;")
         ESCREVAL("F - Sair do sistema.")
         LEIA(OPCAO)
         OPCAO <- MAIUSC(OPCAO)
         ESCOLHA OPCAO
         CASO "A"
            PARA CONTADOR DE 1 ATE NUMERO[AUX] FACA
               ESCREVA("DIGITE O VALOR QUE SERÁ ARMAZENADO NA",CONTADOR,"ª POSIÇÃO DO VETOR: ")
               LEIA(NUMERO[CONTADOR])
            FIMPARA
         CASO "B"
            ESCREVA("QUAL NÚMERO DESEJA ENCONTRAR: ")
            LEIA(BUSCAR)
            PARA CONTADOR DE 1 ATE NUMERO[AUX] FACA
               SE NUMERO[CONTADOR] = BUSCAR ENTAO
                  RESULT_BUSCA <- VERDADEIRO
                  POSICAO <- CONTADOR
               FIMSE
            FIMPARA
            PARA CONTADOR DE 1 ATE NUMERO[AUX] FACA
               ESCREVAL(NUMERO[CONTADOR])
            FIMPARA
            ESCREVAL("")
            ESCREVAL("---------")
            SE RESULT_BUSCA = VERDADEIRO ENTAO
               ESCREVAL("O NÚMERO",BUSCAR,"FOI ENCONTRADO E ESTA NA POSIÇÃO",POSICAO)
            SENAO
               ESCREVAL("O NÚMERO NÃO FOI ENCONTRADO !")
            FIMSE
         CASO "C"
            escreval("QUAL NÚMERO DESEJA EXCLUIR DO VETOR: ")
            leia(BUSCAR)
            SE NUMERO[CONTADOR] = BUSCAR ENTAO
               NUMERO[CONTADOR] <- 0
               ESCREVAL("O NÚMERO",BUSCAR,"NA POSIÇÃO",POSICAO,"DO VETOR FOI EXCLUIDO !")
            FIMSE
            PARA CONTADOR DE 1 ATE NUMERO[AUX]
               PARA AUX DE CONTADOR + 1 ATE AUX FACA
                  SE NUMERO[AUX] > NUMERO[CONTADOR]
                     AUX_TEMP <- NUMERO[AUX]
                     NUMERO[AUX] <- NUMERO[CONTADOR]
                     NUMERO[CONTADOR] <- AUX_TEMP
                  FIMPARA
               FIMPARA
               ESCREVA("VALROES DO VETOR: ")
               PARA CONTADOR DE 1 ATE NUMERO[AUX] FACA
                  ESCREVAL(NUMERO[CONTADOR])
               FIMPARA
            CASO "D"
               ESCREVA("VALORES DO VETOR: ")
               PARA CONTADOR DE 1 ATE NUMERO[AUX] FACA
                  ESCREVAL(NUMERO[CONTADOR])
               FIMPARA
            CASO "E"
               PARA CONTADOR DE 1 ATE NUMERO[AUX] FACA
                  SOMA_VET <- SOMA_VET + NUMERO[CONTADOR]]
               FIMPARA
               ESCREVAL("")
               ESCREVA("A SOMA DO VETOR É:",SOMA_VET)
               
            CASO "F"
               ESCREVAL("ENCERRANDO SISTEMA...")
            OUTROCASO
               ESCREVAL("OPÇÃO INVÁLIDA !")
            FIMESCOLHA
      Fimalgoritmo
    • Por thiago_tw
      eu to com uma tarefa que preciso de ajuda, já tentei alguns algoritmos que achei por aqui mas nunca dá certo, mandei a imagem do que é para ser feito, agradecido se me ajudarem

    • Por Air-Gear
      Olá pessoal!
       
      Entregaram um código já montando e eu preciso fazer uma modificação na parte do campo url, já que ele é uma array de string com tamanho variado. Antes de mexer no código, já funcionava, mas o campo url pegava só a primeira posição. No Front-End que utiliza Javascript eu conseguir resolver, o Back-End que utiliza C# estou pegando agora. Eu implementei um foreach primeiro, mas vi que com for ficou melhor pra montar o código. Visual Studio não deu erro no código, mas não executou como devia. Eu tentei colocar "url = end;", mas apontou erro. Eu estou mais ou menos no caminho. Alguém pode me ajudar?
       
      Segue o código.
      public class clUpload { #region insert internal static bool novoUpload(tbUploadSCP obj) { tbUploadSCP uploadA = new tbUploadSCP(); using (TransactionScope ts = new TransactionScope()) { using (Repository<tbUploadSCP> repSol = new Repositoryupload()) { string[] end = { }; for (int i = 0; i < obj.url.Length; i++) { end[i] = obj.url[i].ToString(); obj.url = end[i]; } uploadA = new tbUploadSCP { url = obj.url, userId = obj.userId, upIdAcao = obj.upIdAcao, upTipo = obj.upTipo, upData = obj.upData, }; repSol.Add(uploadA); //var upMetaPeriodo = UpMetaPeriodo(obj); } ts.Complete(); return true; } } //Resto do código que não tem haver com o problema }  
×

Informação importante

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