Jump to content
Fórum Script Brasil
  • 0

Select de ID com varias ocorrencias


Nfrancisco

Question

Boas pessoal, tenho uma tabela com a seguinte estrutura

XID | NUM | TIPO

5 5 L

3 8 S

1 4 C

1 5 D

7 5 C

Gostaria de obter o resultado 7 - C, ou seja apenas os XID que tem a ocorrência C e apenas a C.

SELECT XID, NUM, Tipo
FROM TAB
WHERE TIPO = 'D'

Isto apenas dá os resultados com D, todos eles.

Julgo ter que usar subqueries, mas não estou a conseguir fazer.

alguém poderá me ajudar?

Edited by Nfrancisco
Colocar código entre CODEs
Link to comment
Share on other sites

6 answers to this question

Recommended Posts

  • 0

Oi 'Nfrancisco',

Poderia ser mais claro, por favor. XID que retorna 7 somante a última linha que tem a tupla (7, 5, C).

Obter a ocorrencia "D" como você solicitou em

XID que tem a ocorrência D e apenas a D
, você já conseguiu com o select que você apresentou.

Portanto não vejo lógica em seu questionamento.

Link to comment
Share on other sites

  • 0
Oi 'Nfrancisco',

Poderia ser mais claro, por favor. XID que retorna 7 somante a última linha que tem a tupla (7, 5, C).

Obter a ocorrencia "D" como você solicitou em

XID que tem a ocorrência D e apenas a D
, você já conseguiu com o select que você apresentou.

Portanto não vejo lógica em seu questionamento.

Antes de mais

Obrigado pela sua pronta disponibilidade para me ajudar.

Vou reformular, uma vez me expliquei mal.

Tabela

XID | NUM | TIPO

5 5 L

3 8 S

1 4 C

1 5 D

7 5 C

8 3 C

8 3 D

Nesta caso se fizer a instrução mencionada,

SELECT XID, NUM, Tipo

FROM TAB

WHERE TIPO = 'D'

vai retornar

XID | NUM | TIPO

1 5 D

8 3 D

O que eu pretendo é obter apenas os XID com o valor D, uma vez que o XID 1, tem os valores

1 4 C

1 5 D

O que eu pretendo é obter o valor

8 3 D

Uma vez que o XID 8 tem apenas um valor e é D.

Quero obter o XID 8 e todos os outros que apenas tem tipo D

Julgo que agora ficou mais claro. Na primeira solicitação coloquei mal o valor de retorno.

Link to comment
Share on other sites

  • 0

'Nfrancisco'

Uma vez que o XID 8 tem apenas um valor e é D.

Quero obter o XID 8 e todos os outros que apenas tem tipo D

Julgo que agora ficou mais claro. Na primeira solicitação coloquei mal o valor de retorno.

com base no que entendi fiz o seguinte exemplo.

Criei uma tabela temporária em memória para armazenar os dados do exemplo.

CREATE TEMPORARY TABLE tab_xid(
xid INT,
num INT,
tipo CHAR(1)
)ENGINE MEMORY;
Carreguei os dados
INSERT INTO tab_xid(xid,num,tipo)
VALUES(5,5, 'L'),(3, 8, 'S'),(1, 4, 'C'),(1, 5, 'D'),(7, 5, 'C'),(9, 3, 'C'),(8, 3, 'D');
Separei em uma consulta somente os dados em XID que tivessem apenas uma ocorrencia
SELECT xid
FROM tab_xid 
GROUP BY xid
HAVING COUNT(xid)=1;
Criei a consulta para que selecionasse os dados que tem o tipo "D"
SELECT x1.xid, x1.num, x1.tipo 
FROM tab_xid x1
WHERE x1.tipo = 'D' AND x1.xid IN (SELECT x2.xid
    FROM tab_xid x2
    GROUP BY x2.xid
    HAVING COUNT(x2.xid) = 1
    );

Link to comment
Share on other sites

  • 0
'Nfrancisco'
Uma vez que o XID 8 tem apenas um valor e é D.

Quero obter o XID 8 e todos os outros que apenas tem tipo D

Julgo que agora ficou mais claro. Na primeira solicitação coloquei mal o valor de retorno.

com base no que entendi fiz o seguinte exemplo.

Criei uma tabela temporária em memória para armazenar os dados do exemplo.

CREATE TEMPORARY TABLE tab_xid(
xid INT,
num INT,
tipo CHAR(1)
)ENGINE MEMORY;
Carreguei os dados
INSERT INTO tab_xid(xid,num,tipo)
VALUES(5,5, 'L'),(3, 8, 'S'),(1, 4, 'C'),(1, 5, 'D'),(7, 5, 'C'),(9, 3, 'C'),(8, 3, 'D');
Separei em uma consulta somente os dados em XID que tivessem apenas uma ocorrencia
SELECT xid
FROM tab_xid 
GROUP BY xid
HAVING COUNT(xid)=1;
Criei a consulta para que selecionasse os dados que tem o tipo "D"
SELECT x1.xid, x1.num, x1.tipo 
FROM tab_xid x1
WHERE x1.tipo = 'D' AND x1.xid IN (SELECT x2.xid
    FROM tab_xid x2
    GROUP BY x2.xid
    HAVING COUNT(x2.xid) = 1
    );

Obrigado pelo exemplo. Falta apenas um pormenor. Na tabela real, podem existir mais do XID com valor D.

O coódigo em anexo apenas responde se houver apenas uma. Segue o exemplo abaixo.

Tabela

XID | NUM | TIPO

5 5 L

3 8 S

1 4 C

1 5 D

7 5 C

8 3 D

8 5 D

1 8 F

8 9 D

O que preciso pegar é apenas o XID - 8. Porque tem D, sem apresentar outros valores. Independentemente do numero de ocorrências, o que preciso de pegar é o XID que apenas tem o Tipo D.

Mais uma vez, Obrigado Denis Courcy.

Link to comment
Share on other sites

  • 0
Tente assim:

SELECT x1.xid, x1.num, x1.tipo 
FROM tab_xid x1
WHERE x1.xid = 8 AND x1.tipo = 'D'

Obrigado pela sugestão, mas essa não vai solucionar. Assim vou pegar 8 e D. O que preciso pegar é todos os XID, com resultado D, apenas e só D, podendo o XID ser igual e o NUM diferente, mas apenas com tipo D.

Se tiver o XID 8. com tipo D, repetido, preciso pegar. Mas se tiver XID 8 e o Tipo D e C, em registos diferentes, já não me interessa. A condição necessária é os XID que apenas apresentam tipo D, embora o mesmo possa estar repetido, em registos "linhas" diferentes.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.2k
    • Total Posts
      652k
×
×
  • Create New...