SELECT DISTINCT EM DUAS TABELAS
-
27 iulie 2006 12:16
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.
Toate mesajele
-
27 iulie 2006 12:19
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.
-
27 iulie 2006 12:24
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!
-
27 iulie 2006 12:38
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;
-
27 iulie 2006 12:39
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.
-
27 iulie 2006 13:16
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ê?
-
27 iulie 2006 13:35
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 -
27 iulie 2006 13:36
faca assim
CREATE PROCEDURE dbo.spListaCidadesPorUF
AsSELECT * FROM
(
SELECT NomeMunicipio, UF FROM Logradouro group by NomeMunicipio, UF
UNION
SELECT NomeMunicipio, UF FROM LOCALIDADE group by NomeMunicipio, UF
) Drv
ORDER BY UF -
27 iulie 2006 13:49
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!
-
27 iulie 2006 14:04
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..
-
26 iulie 2012 14:38
Bom dia Pessoal,
O artigo foi muito útil, porém fiquei com uma dúvida ainda: o que é o Drv ???
-
31 iulie 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.
- Propus ca răspuns de Dih_Cordeiro 31 iulie 2012 20:26
-
31 iulie 2012 20:26
Muitissimo obrigada!!! :DBoa 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.
-
17 august 2012 14:43
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
-
17 august 2012 16:20Já tentou usar o not in no lugar do exists ? Não tem uma chave primária pra comparar?
-
17 august 2012 16:23
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')