1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

select sql

Discussão em 'Programação' iniciada por alfinete, 19 de Julho de 2007. (Respostas: 27; Visualizações: 1573)

  1. alfinete

    alfinete Power Member

    tenho uma tabela em que cada resisto tem n estados

    o mesmo resgisto pode ter estado=0 e estado =2

    notas, pode haver 5 estados possiveis

    eu quero fazer um select que so fassa o select dos registos que so e apenas tem estado=0, ou seja os resgistos que tenham 2 ou mais estados simultaneamente não podem aparecer


    deem o exemplo assim

    select * form tab
    where ..........................

    gostava de uma ajuda
     
    Última edição: 19 de Julho de 2007
  2. OldMan

    OldMan Power Member

    mas tens 2 colunas nessa tabela para inserir os 2 estados?

    do genero estado1=0 e estado2=2?
     
  3. cabiros

    cabiros Power Member

    select * from tab where estado = 0

    Não me parece que seja esta a tua duvida
    Gostaria que colocasses o código da criação da tabela para te poder ajudar
     
    Última edição: 19 de Julho de 2007
  4. SoundSurfer

    SoundSurfer Power Member

    SELECT * FROM

    (
    SELECT [chave e colunas relevantes excepto estado], SUM(estado) as soma FROM [tabela]
    GROUP BY [chave e colunas relevantes excepto estado]
    )

    WHERE soma = 0
     
  5. alfinete

    alfinete Power Member

    só tenho uma coluna nomeada estado , que guarda os varios estados existentes

    do tipo :

    caso1 :
    tenho o pedido com dados x , com estado = 0 e id=0,
    e mesmo pedido com os mesmos dados x , estado=1 e id =2


    caso2 :
    tenho o pedido com dados x , com estado = 0 e id=0,
    e mesmo pedido com os mesmos dados x , estado=1 e id =2
    e mesmo pedido com os mesmos dados x , estado=2 e id =3


    caso 2 :
    tenho o pedido com dados x , com estado = 0 e id=0,

    o pedido do caso 1 e 2 não deve mostrar

    o do caso 3 deve mostrar


    é do tipo isto que quero, so mostrar os registos que so tem apenas estado =0

    do tipo a tabela tem id_util,id_prod,datahora,quantidade,utilizador, estado
    estado pode ser 0/1/2/3/4
     
    Última edição: 19 de Julho de 2007
  6. alfinete

    alfinete Power Member

    este é o meu select sem a clausula where


    Código:
    SELECT   TabUtilizador.Nome, TabPedido.DataHora, TabPedido.Quantidade, TabProduto.Nome, TabProduto.Stock
    FROM         TabUtilizador INNER JOIN
                          TabPedido ON TabUtilizador.Id = TabPedido.IdUtilizador INNER JOIN
                          TabProduto ON TabPedido.IdProduto = TabProduto.Id
    where ................................................
    
     
  7. cabiros

    cabiros Power Member

    Não gosto de INNER JOIN

    É mais simples assim.

    SELECT TabUtilizador.Nome, TabPedido.DataHora, TabPedido.Quantidade, TabProduto.Nome, TabProduto.Stock
    FROM TabUtilizador, TabPedido, TabProduto where TabUtilizador.Id = TabPedido.IdUtilizador
    and TabPedido.IdProduto = TabProduto.Id
    and Tabpedido.Estado = 0

    Supus que a coluna estado estive-se na Tabpedido
    Não fica mais simples de perceber?
    Mas nem sempre podes usar, como por exemplo em [SIZE=-1]LEFT OUTER JOIN


    [/SIZE]
     
  8. alfinete

    alfinete Power Member

    não dá na mesma

    pois assim mostra tdos os pedidos que tem estado =0 , tdo bem, mas se esse pedido ao mesmo tempo tiver estado= 1 mostra na mesma e neste caso eu não queria que mostrasse esse registo

    obrigado na mesma
     
  9. cabiros

    cabiros Power Member

    SELECT TabUtilizador.Nome, TabPedido.DataHora, TabPedido.Quantidade, TabProduto.Nome, TabProduto.Stock
    FROM TabUtilizador, TabPedido, TabProduto where TabUtilizador.Id = TabPedido.IdUtilizador
    and TabPedido.IdProduto = TabProduto.Id
    and Tabpedido.Estado = 0

    e se acrecentares um

    and not exists (SELECT TabUtilizador.Nome, TabPedido.DataHora, TabPedido.Quantidade, TabProduto.Nome, TabProduto.Stock
    FROM TabUtilizador, TabPedido, TabProduto where TabUtilizador.Id = TabPedido.IdUtilizador
    and TabPedido.IdProduto = TabProduto.Id
    and Tabpedido.Estado != 0)

    sera que da erro? se der espero que tenhas percebido o raciocinio ;)
    experimenta em vez de NOT existe mete NOT IN

    se tiveres com MS sql server tem o except

    SELECT TabUtilizador.Nome, TabPedido.DataHora, TabPedido.Quantidade, TabProduto.Nome, TabProduto.Stock
    FROM TabUtilizador, TabPedido, TabProduto where TabUtilizador.Id = TabPedido.IdUtilizador
    and TabPedido.IdProduto = TabProduto.Id
    and Tabpedido.Estado = 0
    except
    (SELECT TabUtilizador.Nome, TabPedido.DataHora, TabPedido.Quantidade, TabProduto.Nome, TabProduto.Stock
    FROM TabUtilizador, TabPedido, TabProduto where TabUtilizador.Id = TabPedido.IdUtilizador
    and TabPedido.IdProduto = TabProduto.Id
    and Tabpedido.Estado != 0)
     
    Última edição: 20 de Julho de 2007
  10. alfinete

    alfinete Power Member

    com not exists não mostra nehum registo, nem os que tem so estado =0

    com o except

    dá este erro

    Incorrect syntax near the keyword 'except'.

    isto no sqlserver2000
     
  11. cabiros

    cabiros Power Member

    Pois é provável que só funcione no 2005.
    experimenta o NOT IN
    O mal é teres isso na mesma tabela onde se encontram os dados
     
    Última edição: 20 de Julho de 2007
  12. alfinete

    alfinete Power Member

    a imagem dos registos da tabela

    [​IMG]


    vendo a imagem temos 4 registos

    com codigo 12,13,18,19 respecticamente

    como devem ter reparado o registo 18,19 são iguais so varia o estado

    na minha pesquiza devido ao 18,19, serem o mesmo(e ter mais que um estado) , so quero mostrar o 12 e o 13
     
  13. cabiros

    cabiros Power Member

    Esquece o que escrevi que ias ter na mesma o mesmo problema

    experimenta

    SELECT TabUtilizador.Nome, TabPedido.DataHora, TabPedido.Quantidade, TabProduto.Nome, TabProduto.Stock
    FROM TabUtilizador, TabPedido, TabProduto where TabUtilizador.Id = TabPedido.IdUtilizador
    and TabPedido.IdProduto = TabProduto.Id
    and Tabpedido.Estado = 0 and not tabpedido.estado !=0
     
    Última edição: 20 de Julho de 2007
  14. alfinete

    alfinete Power Member

    se esqueço o not in como ficamos.
     
  15. AliFromCairo

    AliFromCairo Power Member

    Penso que a solução que o SoundSurfer sugeriu funciona, embora ele na altura não tivesse todos os dados necessários.

    Segue outra versão (usei o AS para não tornar a query muito verbosa):

    Código:
    [B]SELECT[/B] u.Nome, pe.DataHora, pe.Quantidade, pr.Nome, pr.Stock
    [B]FROM[/B] TabUtilizador [B]AS[/B] u [B]INNER JOIN[/B] TabPedido [B]AS[/B] pe [B]ON[/B] u.Id = pe.IdUtilizador 
             [B]INNER JOIN[/B] TabProduto [B]AS[/B] pr [B]ON[/B] pe.IdProduto = pr.Id
    [B]GROUP BY[/B] pe.IdUtilizador, pe.IdProduto, pe.Quantidade, pe.DataHora
    [B]HAVING SUM[/B](estado) = 0;
    
    Alternativamente, podias usar uma subquery correlacionada, mas a query ficaria bastante maior. No entanto, caso o teu estado deixe de ser um tipo numérico e passe a ser texto, esta solução pode ser viável.
     
  16. alfinete

    alfinete Power Member

    agradeço as voças ajudas

    mas não consegui resolver o prob , mas aqui vai uma explicação julgo eu melhor.

    resumindo

    imagem da bd que tenho

    [​IMG]


    os campos que quero seleccionar são os que estão na imagem dos registos da BD
    vistos a baixo

    http://img165.imageshack.us/my.php?image=tabpedidoma9.jpg

    fazemdo assim

    Código:
    SELECT   TabUtilizador.Nome, TabPedido.DataHora, TabPedido.Quantidade, TabProduto.Nome, TabProduto.Stock
    FROM         TabUtilizador INNER JOIN
                          TabPedido ON TabUtilizador.Id = TabPedido.IdUtilizador INNER JOIN
                          TabProduto ON TabPedido.IdProduto = TabProduto.Id
    where TabPedido.estado=0
    
    
    com este code ele mostrame os registos 12,13,18

    mas como o 18 e o 19 são o mesmo pedido mas com estado diferente

    eu so quero mostrar o 12 e o 13

    espero que assim ajude mais

    obrigado
     
  17. AliFromCairo

    AliFromCairo Power Member

    Experimentaste o código que coloquei em cima? E não mostra só os registos que queres?
     
    Última edição: 20 de Julho de 2007
  18. alfinete

    alfinete Power Member

    experimentei a solução do AliFromCairo, mas não dá nada, dá erros

    obrigado na mesma


     
  19. AliFromCairo

    AliFromCairo Power Member

    Podes indicar quais foram os erros pf.
     
  20. alfinete

    alfinete Power Member

    o erro é este

    Server: Msg 8120, Level 16, State 1, Line 7
    Column 'u.Nome' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
    Server: Msg 8120, Level 16, State 1, Line 7
    Column 'pr.Nome' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
    Server: Msg 8120, Level 16, State 1, Line 7
    Column 'pr.Stock' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
     

Partilhar esta Página