Usuário com melhor resposta
SELECT DISTINCT EM DUAS TABELAS

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 HorizonteRJ 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.
Respostas
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 UFAbs.
-
-
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;
-
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 LOCALIDADESelect * From (
Select * From LOGRADOURO
union
Select * From LOGRADOURO) Drv Order By UFEspero ter ajudado.
-
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 LogradouroSELECT DISTINCT NomeMunicipio, UF INTO #LOCALIDADE FROM Localidade
SELECT * FROM
(
SELECT NomeMunicipio, UF FROM #LOGRADOURO
UNION
SELECT NomeMunicipio, UF FROM #LOCALIDADE
) Drv
ORDER BY UFReturn
Porém eu estou executando e não vem nenuhm resultado.
Vocês saberiam me dizer por quê?
-
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.LOGRADOUROSELECT 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 procedureSalvador BA
Belo Horizonte MG
Rio de Janeiro RJ
Campinas SP
São Paulo SP -
-
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!
-
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.LOGRADOUROSELECT DISTINCT NomeMunicipio, UF INTO #LOCALIDADE FROM dbo.LOCALIDADE
SELECT * FROM
(
SELECT NomeMunicipio, UF FROM #LOGRADOURO
UNION
SELECT NomeMunicipio, UF FROM #LOCALIDADE
) Drv
ORDER BY UFe no final executei com o comando abaixo:
exec dbo.spListaCidadesPorUF
Para mim deu certo hehehe , mas beleza o bom que conseguiu.
Valeu..
-
-
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
-
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.
-
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
-
-