Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

ricardocoimbra

Utilização do select DISTINCT duvida

Recommended Posts

ricardocoimbra

Eu queria que ele do campo utilizador me lista-se apenas uma vez esse usario:

Faço:

select DISTINCT utilizador from utilizadores

mas acontece que eu nessa mesma query queria seleccionar outros campos mas já fora de comparação, eu apenas quero que ele nao inclua o mesmo utilizador....

Pra selecionar todos os campos seria:

select * from utilizadores

Mas e agora pra excluir utilizador repetidos e ao mesmo tempo selecionar o resto dos campos?

Share this post


Link to post
Share on other sites
Tiago Salgado

Não percebo o q queres fazer. Dizes que queres apenas uma consulta que retorne os utilizadores mas só pode aparecer uma vez cada utilizador. E nessa mesma listagem queres q apareçam mais dados relativos ao utilizador.

Caso o utilizador esteja repetido, só vai aparecer o que foi escolhido no "DISTINCT" correcto ? é isso que pretendes ?

Share this post


Link to post
Share on other sites
ricardocoimbra

SELECT DISTINCT * FROM utilizadores -> ele ve todos os campos com valores iguais e elimina

SELECT DISTINCT utilizador  FROM utilizadores -> ele apenas verifica o do campo utilizador e elimina o repetido

e é isso que eu quero, mas como eu quero passar o resto dos dados pra um array como seleciono dessa tabela o resto id, nome, morada... é que só com o * é que ele me seleciona os campos todos fiz me perceber?

Não percebo o q queres fazer. Dizes que queres apenas uma consulta que retorne os utilizadores mas só pode aparecer uma vez cada utilizador. E nessa mesma listagem queres q apareçam mais dados relativos ao utilizador.

Caso o utilizador esteja repetido, só vai aparecer o que foi escolhido no "DISTINCT" correcto ? é isso que pretendes ?

Share this post


Link to post
Share on other sites
ricardocoimbra

Sim como faço?

Não percebo o q queres fazer. Dizes que queres apenas uma consulta que retorne os utilizadores mas só pode aparecer uma vez cada utilizador. E nessa mesma listagem queres q apareçam mais dados relativos ao utilizador.

Caso o utilizador esteja repetido, só vai aparecer o que foi escolhido no "DISTINCT" correcto ? é isso que pretendes ?

Share this post


Link to post
Share on other sites
Rui Carlos

deixa-me ver se percebi, tu tens duas linhas com o mesmo utilizador mas com outros atributos repetidos, por exemplo:

utilizador | id

abc | 1

abc | 2

def | 3

def | 4

o que tu querias era que cada utilizador aparecesse apenas uma vez, certo?

abc | ...

def | ...

mas se é isto que tu queres, qual é o valor que devia ficar associado a 'abc' (por exemplo)? 1 ou 2?

Share this post


Link to post
Share on other sites
ricardocoimbra

Sim quero que cada utilizador apareça apenas 1 vez  exacto Rui carlos:

abc

def

Mas como faço pra ir pra o array o resto dos valores da tabela mas referentes a esses utilizadores id, nome , morada?

Porque ao fazer :

SELECT DISTINCT utilizador  FROM utilizadores -> ele depois so me vai dar o valor do "utilizador" e eu queria do resto dos campos (nome, morada, telefone)

deixa-me ver se percebi, tu tens duas linhas com o mesmo utilizador mas com outros atributos repetidos, por exemplo:

utilizador | id

abc | 1

abc | 2

def | 3

def | 4

o que tu querias era que cada utilizador aparecesse apenas uma vez, certo?

abc | ...

def | ...

mas se é isto que tu queres, qual é o valor que devia ficar associado a 'abc' (por exemplo)? 1 ou 2?

Share this post


Link to post
Share on other sites
Hipnoted

Mas isso é impossível, isto é, se eu percebi bem.

Se queres apenas um utilizador como é que o SGBD vai saber quais são os outros dados dos registos. Imagina, tens 5 registos do mesmo utilizador (Utilizador1), quem tem os id 1, 2, 3, 4 e 5. É impossível dar-te só um resultado porque existem dados diferentes.


"Nunca discutas com um idiota. Eles arrastam-te até ao seu nível e depois ganham-te em experiência"

Share this post


Link to post
Share on other sites
ricardocoimbra

Das duas uma ou eu nao me estou a explicar bem ou não dá mesmo pra fazer!

com SELECT DISTINCT utilizador -> ele "elimina" todos que tiverem o utilizador igual, mas imagina que ele me dá isto

utilizador

1

2

O que eu quero é na tabela ao mesmo tempo selecionar o resto dos "campos" (nome, telefone) desses utilizadores que me foram listados percebes? como é que eu vou pegar os dados nome, telefone? porque na query acima só seleciono o campo utilizador com DISTINCT

utilizador | nome | telefone

1            | joao  |

2            | Ana    |

Quero no fundo é fazer o DISTINCT apenas ao campo "utilizador" e ao mesmo tempo selecionar o campo nome e telefone mas esses já nao fazerem parte do DISTINCT.

Mas isso é impossível, isto é, se eu percebi bem.

Se queres apenas um utilizador como é que o SGBD vai saber quais são os outros dados dos registos. Imagina, tens 5 registos do mesmo utilizador (Utilizador1), quem tem os id 1, 2, 3, 4 e 5. É impossível dar-te só um resultado porque existem dados diferentes.

Share this post


Link to post
Share on other sites
Rui Carlos

mas quais dos outros atributos de um mesmo utilizador é que o SGBD vai escolher?

repetindo a questão que coloquei acima:

mas se é isto que tu queres, qual é o valor que devia ficar associado a 'abc' (por exemplo)? 1 ou 2?

parece-me que vai ser uma operação não determinística, razão pelo qual não sei se será possível fazer em SQL.

Share this post


Link to post
Share on other sites
SoulOnFire

SELECT DISTINCT * FROM utilizadores

WHERE utilizador  in ( SELECT DISTINCT utilizador  FROM utilizadores)

N sera isto que queres??


Fikem Bem!!!Miguel Duarte - (SoulOnFire)O meu BLOG - XAML E WPF - http://wpfpt.wordpress.com/

Share this post


Link to post
Share on other sites
Rui Carlos

isso não vai funcionar... o DISTINCT da primeira linha não vai fazer nada, pois só o atributo utilizador é que aparece repetido. por outro lado, o WHERE também não faz efeito, pois mesmo que já tenha aparecido um utilizador que esteja dentro do SELECT DISTINCT utilizador  FROM utilizadores, como ele não é removido desta lista, quando voltar a aparecer o mesmo utilizador, ele continua a cumprir as condições da clausula WHERE.

Share this post


Link to post
Share on other sites
SoulOnFire

Repara nesta tabela

[table]

 

    [td]S[/td]

 

 

    [td]N[/td]

 

 

    [td]S[/td]

 

 

    [td]N[/td]

 

 

    [td]N[/td]

 

 

    [td]S[/td]

 

 

    [td]N[/td]

 

 

    [td]S[/td]

 

 

    [td]N[/td]

 

 

    [td]S[/td]

 

 

    [td]S[/td]

 

 

    [td]N[/td]

 

 

    [td]N[/td]

 

 

    [td]S[/td]

 

[/table]

é o resultado de "SELECT NUM_SEQUENCIAL, TIPO_CIRURGIA FROM MX_LISTAS_ESPERA

ORDER BY NUM_SEQUENCIAL"

O resultado de "  SELECT NUM_SEQUENCIAL, TIPO_CIRURGIA FROM MX_LISTAS_ESPERA

  WHERE NUM_SEQUENCIAL in (SELECT DISTINCT NUM_SEQUENCIAL FROM MX_LISTAS_ESPERA)

  ORDER BY NUM_SEQUENCIAL" é este, que é precisamente igual

[table]

 

    [td]S[/td]

 

 

    [td]N[/td]

 

 

    [td]S[/td]

 

 

    [td]N[/td]

 

 

    [td]N[/td]

 

 

    [td]S[/td]

 

 

    [td]N[/td]

 

 

    [td]S[/td]

 

 

    [td]N[/td]

 

 

    [td]S[/td]

 

 

    [td]S[/td]

 

 

    [td]N[/td]

 

 

    [td]N[/td]

 

 

    [td]S[/td]

 

[/table]

Agora s fizerer "SELECT DISTINCT  NUM_SEQUENCIAL, TIPO_CIRURGIA FROM MX_LISTAS_ESPERA

  WHERE NUM_SEQUENCIAL in (SELECT DISTINCT NUM_SEQUENCIAL FROM MX_LISTAS_ESPERA)

  ORDER BY NUM_SEQUENCIAL", corta a linha repetida de 14635 N

[table]

 

    [td]S[/td]

 

 

    [td]N[/td]

 

 

    [td]S[/td]

 

 

    [td]N[/td]

 

 

    [td]S[/td]

 

 

    [td]N[/td]

 

 

    [td]S[/td]

 

 

    [td]N[/td]

 

 

    [td]S[/td]

 

 

    [td]S[/td]

 

 

    [td]N[/td]

 

 

    [td]N[/td]

 

 

    [td]S[/td]

 

[/table]

Penso que é isso k ele quer!! digo eu...


Fikem Bem!!!Miguel Duarte - (SoulOnFire)O meu BLOG - XAML E WPF - http://wpfpt.wordpress.com/

Share this post


Link to post
Share on other sites
SoulOnFire

14635 N

14635 S

tens isto no último resultado, penso que ele quer que o 14635 apareça apenas uma vez.

Ok...já percebi...

Se for assim n tem hipoteses.... tipo n n há forma de criar essa excepção... acho...

Mas tb n vejo logica disso s tem dados diferentes para k obter so 1 deles... mas pronto


Fikem Bem!!!Miguel Duarte - (SoulOnFire)O meu BLOG - XAML E WPF - http://wpfpt.wordpress.com/

Share this post


Link to post
Share on other sites
naoliveira
Porque ao fazer :

SELECT DISTINCT utilizador  FROM utilizadores -> ele depois so me vai dar o valor do "utilizador" e eu queria do resto dos campos (nome, morada, telefone)

SELECT DISTINCT utilizador, morada, telefone  FROM utilizadores

Share this post


Link to post
Share on other sites
Rui Carlos
Porque ao fazer :

SELECT DISTINCT utilizador  FROM utilizadores -> ele depois so me vai dar o valor do "utilizador" e eu queria do resto dos campos (nome, morada, telefone)

SELECT DISTINCT utilizador, morada, telefone  FROM utilizadores

mas assim pode repetir os utilizadores.

Share this post


Link to post
Share on other sites
naoliveira

não sei porquê, mas tenho a impressão que a morada e o telefone são sempre iguais para cada utilizador repetido (por isso é que ele queria ter também a morada e o telefone), senão não faz sentido nenhum o que ele quer, como já aqui foi dito.

Share this post


Link to post
Share on other sites
ricardocoimbra

Não porque ele assim seleciona utilizadores iguais!

SELECT DISTINCT * FROM utilizadores

WHERE utilizador  in ( SELECT DISTINCT utilizador  FROM utilizadores)

N sera isto que queres??

mas quais dos outros atributos de um mesmo utilizador é que o SGBD vai escolher?

repetindo a questão que coloquei acima:

mas se é isto que tu queres, qual é o valor que devia ficar associado a 'abc' (por exemplo)? 1 ou 2?

Isso depois é indiferente Rui Carlos o que eu quero mesmo é que ele selecione

abc | 1 | nome | telefone

def | 2 | nome | telefone

Apenas o nome do utilizador é que nao pode ser igual

Share this post


Link to post
Share on other sites
RVG

boas mais uma vez....

tenho andado a ler as mensagens, e gostaria de saber qual a fixacao do pessoal pelo "distinct"....

SELECT DISTINCT * FROM utilizadores

WHERE utilizador  in ( SELECT DISTINCT utilizador  FROM utilizadores)

SELECT DISTINCT  NUM_SEQUENCIAL, TIPO_CIRURGIA FROM MX_LISTAS_ESPERA

  WHERE NUM_SEQUENCIAL in (SELECT DISTINCT NUM_SEQUENCIAL FROM MX_LISTAS_ESPERA)

  ORDER BY NUM_SEQUENCIAL,corta a linha repetida de 14635 N

ja experimentaram fazer testes com estas queries ?

@SoulOnFire, se a ideia é remover o 14635 N, un group by Num_sequencial, tipo_cirurgia, nao sera melhor do que fazer 2 distinct e uma sub-querie ?

Isso depois é indiferente Rui Carlos o que eu quero mesmo é que ele selecione

abc | 1 | nome | telefone

def | 2 | nome | telefone

mais uma vez, o servidor é que escolhe....  ;)

morada e telefone, estao na tabela utilizadores ou noutra tabela?

Share this post


Link to post
Share on other sites
shumy

Acho melhor resumir isto no seguinte:

Isso não funciona. Tens de separar em duas tabelas ou ter campos repetidos na mesma tabela (não normalizado).


Aqui há coisa de 2 anos fazia umas malhas de croché, depois fartei-me e fui para informática!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.