none
SELECT DISTINCT EM DUAS TABELAS RRS feed

  • Pergunta

  • Pessoal,

    É o seguinte:

    Estou precisando fazer um select em duas tabelas (Logradouro e Localidade). Todas as duas tabelas possuem as colunas NomeMunicipio e UF, porém existem municípios que estão em uma tabela e em outra não e às vezes estão nas duas tabelas.

    Ex:

    TABELA LOGRADOURO

    ID   Logradouro   NomeMunicipio     UF

    1    Rua 1        Belo Horizonte    MG

    2    Rua 2        São Paulo         SP

    3    Rua 3        Rio de Janeiro    RJ

    4    Rua 4        Rio de Janeiro    RJ

    5    Rua 5        Salvador          BA

     

    TABELA LOCALIDADE

    ID   NomeMunicipio     UF

    1    Belo Horizonte    MG

    2    Campinas          SP

    3    Salvador          BA

    4    Rio de Janeiro    RJ

     

    Preciso fazer um select distinct que pegue todas as cidades das duas tabelas e as traga em ordem alfabética por UF, Cidade, verificando se a UF é igual entre as duas tabelas (isso porque existem cidades com o mesmo nome em estados diferentes). Ou seja, o resultado da minha query tem que trazer:

    UF    Cidade

    BA    Salvador

    MG    Belo Horizonte

    RJ    Rio de Janeiro

    SP    Campinas

    SP    São Paulo

    Acredito q eu vou ter q fazer um select em cada uma das tabelas e depois fazer um terceiro select em cima dos dois selects anteriores. Porém, se for isso mesmo que eu tenha que fazer, não sei como.

    Ogrigado.

    quinta-feira, 27 de julho de 2006 12:16

Respostas

  • faca assim

     

    CREATE PROCEDURE dbo.spListaCidadesPorUF
    As

    SELECT * FROM
    (
     SELECT NomeMunicipio, UF FROM Logradouro group by NomeMunicipio, UF
     UNION
     SELECT NomeMunicipio, UF FROM LOCALIDADE group by NomeMunicipio, UF
    ) Drv
    ORDER BY UF

     

    quinta-feira, 27 de julho de 2006 13:36

Todas as Respostas

  • segue exemplo

     

    Create Table #tabela1 (UF char(02))
    insert into #tabela1 (UF) Values ('AA')
    insert into #tabela1 (UF) Values ('AB')
    insert into #tabela1 (UF) Values ('AC')


    Create Table #tabela2 (UF char(02))
    insert into #tabela1 (UF) Values ('AB')
    insert into #tabela1 (UF) Values ('AC')
    insert into #tabela1 (UF) Values ('AD')
    insert into #tabela1 (UF) Values ('AF')

    Select * From (
    Select * From #Tabela1
    union
    Select * From #Tabela1) Drv Order By UF

     

    Abs.

    quinta-feira, 27 de julho de 2006 12:19
  • Marcelo,

    Brigadão pela rápida resposta. Mas não entendi direito. Estou começando agora com SQL. Teria como você fazer um exemplo utilizando as tabelas e dados que coloquei? Cara, se tiver jeito vai ajudar pra caramba.

    Brigado!

    quinta-feira, 27 de julho de 2006 12:24
  • segue exemplo

     

     

    Create Table #LOGRADOURO (ID int, Logradouro Varchar(50),  NomeMunicipio Varchar(50),  UF varchar(02))
    insert into #LOGRADOURO (ID,   Logradouro,   NomeMunicipio, UF) Values (1,'Rua 1','Belo Horizonte','MG')
    insert into #LOGRADOURO (ID,   Logradouro,   NomeMunicipio, UF) Values (2,'Rua 2','São Paulo     ','SP')
    insert into #LOGRADOURO (ID,   Logradouro,   NomeMunicipio, UF) Values (3,'Rua 3','Rio de Janeiro','RJ')
    insert into #LOGRADOURO (ID,   Logradouro,   NomeMunicipio, UF) Values (4,'Rua 4','Rio de Janeiro','RJ')
    insert into #LOGRADOURO (ID,   Logradouro,   NomeMunicipio, UF) Values (5,'Rua 5','Salvador      ','BA')

    Create Table #LOCALIDADE (ID int,  NomeMunicipio Varchar(50),  UF varchar(02))
    Insert into #LOCALIDADE (ID, NomeMunicipio, UF) Values  (1,'Belo Horizonte','MG')
    Insert into #LOCALIDADE (ID, NomeMunicipio, UF) Values (2,'Campinas      ','SP')
    Insert into #LOCALIDADE (ID, NomeMunicipio, UF) Values (3,'Salvador      ','BA')
    Insert into #LOCALIDADE (ID, NomeMunicipio, UF) Values (4,'Rio de Janeiro','RJ')

    select * From (
    Select  NomeMunicipio, UF From #LOGRADOURO
    Union
    Select  NomeMunicipio, UF From #LOCALIDADE) Drv Order By UF

     
     

     

    Abs;

    quinta-feira, 27 de julho de 2006 12:38
  • Giuliano,

    O exemplo que o colla vez esta mesmo certo olha abaixo:

    CREATE TABLE LOGRADOURO (ID CHAR(2),Logradouro CHAR(10), NomeMunicipio CHAR(20),UF CHAR(2))
    INSERT INTO LOGRADOURO VALUES('1','Rua 1','Belo Horizonte','MG')
    INSERT INTO LOGRADOURO VALUES('2','Rua 2','São Paulo','SP')
    INSERT INTO LOGRADOURO VALUES('3','Rua 3','Rio de Janeiro','RJ')
    INSERT INTO LOGRADOURO VALUES('4','Rua 4','Rio de Janeiro','RJ')
    INSERT INTO LOGRADOURO VALUES('5','Rua 5','Salvador','BA')

    SELECT * FROM LOGRADOURO

    CREATE TABLE LOCALIDADE(ID CHAR(2),NomeMunicipio CHAR(15),UF CHAR(2))
    INSERT INTO LOCALIDADE VALUES('1','Belo Horizonte','MG')
    INSERT INTO LOCALIDADE VALUES('1','Belo Horizonte', 'MG')
    INSERT INTO LOCALIDADE VALUES('2','Campinas', 'SP')
    INSERT INTO LOCALIDADE VALUES('3','Salvador','BA')
    INSERT INTO LOCALIDADE VALUES('4','Rio de Janeiro','RJ')
    DROP TABLE LOCALIDADE
    SELECT * FROM LOCALIDADE

    Select * From (
    Select * From LOGRADOURO
    union
    Select * From LOGRADOURO) Drv Order By UF

    Espero ter ajudado.

     

    quinta-feira, 27 de julho de 2006 12:39
  • Marcelo e Daniel,

    Agora eu entendi, ou melhor, acho que entendi. Porém, como esses dados estão vindo de uma base que tem muitas outras cidades além das que eu listei, eu alterei para criar as tabelas #LOCALIDADE e #LOGRADOURO com base em um select nas tabelas.

    A minha StoredProcedure ficou assim:

    CREATE PROCEDURE dbo.spListaCidadesPorUF
    As
    SELECT DISTINCT NomeMunicipio, UF INTO #LOGRADOURO FROM Logradouro

    SELECT DISTINCT NomeMunicipio, UF INTO #LOCALIDADE FROM Localidade

    SELECT * FROM
    (
     SELECT NomeMunicipio, UF FROM #LOGRADOURO
     UNION
     SELECT NomeMunicipio, UF FROM #LOCALIDADE
    ) Drv
    ORDER BY UF

    Return

    Porém eu estou executando e não vem nenuhm resultado.

    Vocês saberiam me dizer por quê?

    quinta-feira, 27 de julho de 2006 13:16
  • Giuliano fiz uns testes aqui e deu certo a unica diferença e return no final que eu tirei:

    CREATE PROCEDURE dbo.spListaCidadesPorUF
    As
    SELECT DISTINCT NomeMunicipio, UF INTO #LOGRADOURO FROM dbo.LOGRADOURO

    SELECT DISTINCT NomeMunicipio, UF INTO #LOCALIDADE FROM dbo.LOCALIDADE

    SELECT * FROM
    (
     SELECT NomeMunicipio, UF FROM #LOGRADOURO
     UNION
     SELECT NomeMunicipio, UF FROM #LOCALIDADE
    ) Drv
    ORDER BY UF


    exec dbo.spListaCidadesPorUF -- Execução da stored procedure

    Salvador             BA
    Belo Horizonte       MG
    Rio de Janeiro       RJ
    Campinas             SP
    São Paulo            SP

    quinta-feira, 27 de julho de 2006 13:35
  • faca assim

     

    CREATE PROCEDURE dbo.spListaCidadesPorUF
    As

    SELECT * FROM
    (
     SELECT NomeMunicipio, UF FROM Logradouro group by NomeMunicipio, UF
     UNION
     SELECT NomeMunicipio, UF FROM LOCALIDADE group by NomeMunicipio, UF
    ) Drv
    ORDER BY UF

     

    quinta-feira, 27 de julho de 2006 13:36
  • Respostas:

    Daniel - Não sei porque cargas d´água do jeito que você me mandou não rolou (e olha que eu fui na base do Ctrl+C e Ctrl+V). Mas de toda forma obrigado. Não entendi porque não rodou, se rodou aí... Mas tá valendo.

    Marcelo - Valeu meu camarada. Funcionou blz... Coloquei ainda a cláusula Where UF = @UF e testei e também funcionou redondinho..

    Fiquei com uma curiosidade: O que significa Drv ???

    Isso até agora eu não sei.

    Obrigado a vocês pela ajuda!

    quinta-feira, 27 de julho de 2006 13:49
  • Giuliano,

    Beleza cara sem problemas, mas peguei sei exemplo e so tirei o return no final até porque você quer fazer o distinct antes do logradouro e localidade.

    DROP PROCEDURE dbo.spListaCidadesPorUF

    CREATE PROCEDURE dbo.spListaCidadesPorUF
    As
    SELECT DISTINCT NomeMunicipio, UF INTO #LOGRADOURO FROM dbo.LOGRADOURO

    SELECT DISTINCT NomeMunicipio, UF INTO #LOCALIDADE FROM dbo.LOCALIDADE

    SELECT * FROM
    (
     SELECT NomeMunicipio, UF FROM #LOGRADOURO
     UNION
     SELECT NomeMunicipio, UF FROM #LOCALIDADE
    ) Drv
    ORDER BY UF

    e no final executei com o comando abaixo:

    exec dbo.spListaCidadesPorUF

    Para mim deu certo hehehe , mas beleza o bom que conseguiu.

    Valeu..

     

    quinta-feira, 27 de julho de 2006 14:04
  • Bom dia Pessoal,

    O artigo foi muito útil, porém fiquei com uma dúvida ainda: o que é o Drv ???

    quinta-feira, 26 de julho de 2012 14:38
  • Boa tarde Dih,

    olhando a sintaxe da cláusula SELECT você perceberá que sempre virá uma tabela após a cláusula FROM, neste caso fora usado uma subquerie, um select dentro do outro que retorna uma tabela, o DVR é um apelido dado a tabela retornada pela subquerie para que a cláusula from possa referenciar.

    • Sugerido como Resposta Dih_Cordeiro terça-feira, 31 de julho de 2012 20:26
    terça-feira, 31 de julho de 2012 19:54
  • Boa tarde Dih,

    olhando a sintaxe da cláusula SELECT você perceberá que sempre virá uma tabela após a cláusula FROM, neste caso fora usado uma subquerie, um select dentro do outro que retorna uma tabela, o DVR é um apelido dado a tabela retornada pela subquerie para que a cláusula from possa referenciar.

    Muitissimo obrigada!!! :D
    terça-feira, 31 de julho de 2012 20:26
  • Bom Dia Pessoal...preciso de uma ajuda...

    Estou com duas tabelas ambas tem registros de 2008 só que uma tem 221 registros a mais que a outra e gostaria de pegar esta diferença entre as duas no que se refere, entendeu?!

    Quanod executoi o select :

    SELECT

    COUNT(*) FROM Item_Pedido2 a WHERE

    not EXISTS(


    SELECT 1 FROM Item_Pedido c


    WHERE

    a.cod_pedido = c.cod_pedido


    and

    c.dat_inc between '2008-01-01' and '2008-12-31')

    Ele me retornar mais de 100 mil registros..então isso que é dizer q minha tabela tiem pedido 2 tem mais de 100.00 registros diferentes da item pedido?..Porque qdo dou um count em cada com 2008 no where da a diferença de 221 registros...Peço ajuda!!!!


    Milena

    sexta-feira, 17 de agosto de 2012 14:43
  • Já tentou usar o not in no lugar do exists ? Não tem uma chave primária pra comparar?
    sexta-feira, 17 de agosto de 2012 16:20
  • Ficaria mais ou menos assim:

    SELECT
    
    COUNT(*) FROM Item_Pedido2 a WHERE a.cod_pedido
    
    not in(
    
    SELECT c.cod_pedido FROM Item_Pedido c
    
    WHERE
    
    c.dat_inc between '2008-01-01' and '2008-12-31')


    sexta-feira, 17 de agosto de 2012 16:23