Nfrancisco Posted January 10, 2012 Report Share Posted January 10, 2012 (edited) Boas pessoal, tenho uma tabela com a seguinte estruturaXID | NUM | TIPO5 5 L3 8 S1 4 C1 5 D7 5 CGostaria 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 January 10, 2012 by Nfrancisco Colocar código entre CODEs Quote Link to comment Share on other sites More sharing options...
0 Denis Courcy Posted January 10, 2012 Report Share Posted January 10, 2012 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. Quote Link to comment Share on other sites More sharing options...
0 Nfrancisco Posted January 10, 2012 Author Report Share Posted January 10, 2012 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.TabelaXID | NUM | TIPO5 5 L3 8 S1 4 C1 5 D7 5 C8 3 C8 3 DNesta caso se fizer a instrução mencionada, SELECT XID, NUM, TipoFROM TABWHERE TIPO = 'D'vai retornarXID | NUM | TIPO1 5 D8 3 DO que eu pretendo é obter apenas os XID com o valor D, uma vez que o XID 1, tem os valores1 4 C1 5 DO que eu pretendo é obter o valor 8 3 DUma vez que o XID 8 tem apenas um valor e é D.Quero obter o XID 8 e todos os outros que apenas tem tipo DJulgo que agora ficou mais claro. Na primeira solicitação coloquei mal o valor de retorno. Quote Link to comment Share on other sites More sharing options...
0 Denis Courcy Posted January 10, 2012 Report Share Posted January 10, 2012 '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 DJulgo 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 dadosINSERT 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 ); Quote Link to comment Share on other sites More sharing options...
0 Nfrancisco Posted January 10, 2012 Author Report Share Posted January 10, 2012 '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 DJulgo 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 dadosINSERT 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.TabelaXID | NUM | TIPO5 5 L3 8 S1 4 C1 5 D7 5 C8 3 D8 5 D1 8 F8 9 DO 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. Quote Link to comment Share on other sites More sharing options...
0 Denis Courcy Posted January 10, 2012 Report Share Posted January 10, 2012 Tente assim:SELECT x1.xid, x1.num, x1.tipo FROM tab_xid x1 WHERE x1.xid = 8 AND x1.tipo = 'D' Quote Link to comment Share on other sites More sharing options...
0 Nfrancisco Posted January 10, 2012 Author Report Share Posted January 10, 2012 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. Quote Link to comment Share on other sites More sharing options...
Question
Nfrancisco
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.
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 NfranciscoColocar código entre CODEs
Link to comment
Share on other sites
6 answers to this question
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.