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

ricardocoimbra

Utilização do select DISTINCT duvida

20 mensagens neste tópico

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?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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 ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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 ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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 ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

SELECT DISTINCT * FROM utilizadores

WHERE utilizador  in ( SELECT DISTINCT utilizador  FROM utilizadores)

N sera isto que queres??

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

14635 N

14635 S

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora