none
Case verificando ligações de uma tabela RRS feed

  • Pergunta

  • Imagine que eu tenho uma tabela A com o campo Id e outros campos não relevantes pra essa pergunta...

    Tenho também uma tabela B que possui a o Id da tabela A ou seja a foreign key.

    A relação e A para B é 1 para N, ou seja A pode ter varias registro B ligados a ela.

    Bom... preciso de um case que me diga se existe algum registro B ligado a A.

    É obvio que o mais simples seria:

    Select A.*,
    PossuiB = (Case When (Select count(B.id) from B where B.IdA = A.id) > 1 Then 'True' Else 'False' End)
    from A Where...

    Porém a execução é muito lenta mesmo retornando apenas 300 registro de A.

    Outra forma que se mostrou ainda mais lenta foi a seguinte...

    Select A.*, 
    PossuiB = CASE 
    WHEN Count(B.id) 
    OVER (partition BY A.id) > 0 THEN 'True' 
    ELSE 'False' 
    END 
    from A 
    inner join B on A.Id = B.IdA
    Where...

    Então... alguém saberia me informar a melhor forma de fazer isso, tenho que fazer a mesmo coisa (verificar se existe ligação), com mais outras 2 tabela, oque esta deixando a consulta extremamente lenta....

    Obrigado!!


    segunda-feira, 12 de agosto de 2013 13:55

Todas as Respostas

  • Deleted
    segunda-feira, 12 de agosto de 2013 14:17
  • Já tentei assim...

    select A.Id, 
    PossuiB = Case When EXISTS (Select 1 from B where B.IdA = A.Id) Then 'True' Else 'False' End
    from A
    WHERE...

    igualmente lento... =/

    segunda-feira, 12 de agosto de 2013 14:23
  • Bom dia,

    Elton, experimente dessa forma para ver o que acontece:

    PossuiB = (Case When (Select top 1 1 from B where B.IdA = A.id) = 1 Then 'True' Else 'False' End)

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    segunda-feira, 12 de agosto de 2013 14:27
  • Deleted
    segunda-feira, 12 de agosto de 2013 14:30
  • Deleted
    segunda-feira, 12 de agosto de 2013 18:48
  • Elton,

    Vamos por partes, realizando um simples select em cada table, quanto tempo o SQL Server demorá para retornar todos os dados.

    Quando você realiza um Join entre estas tables o retorno dos dados também é lento?

    Você esta dizendo que existe um relacionamento este estas tables, este relacionamento existe fisicamente no Banco ou é somente um relacionamento lógico?

    Vale ressaltar que para ocorrer um Table Scan, as tabelas envolvidas no Select não estão apresentando índices, principalmente chave primária.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]


    quarta-feira, 14 de agosto de 2013 13:54
  • Elton,

    Vamos por partes, realizando um simples select em cada table, quanto tempo o SQL Server demorá para retornar todos os dados.

    Quando você realiza um Join entre estas tables o retorno dos dados também é lento?

    Você esta dizendo que existe um relacionamento este estas tables, este relacionamento existe fisicamente no Banco ou é somente um relacionamento lógico?

    Vale ressaltar que para ocorrer um Table Scan, as tabelas envolvidas no Select não estão apresentando índices, principalmente chave primária.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]


    Quando realizo a consulta nas tabelas individualmente a resposta é instantânea, o mesmo acontece quando faço o join entre elas.

    O relacionamento é apenas lógico. 

    sexta-feira, 16 de agosto de 2013 12:16
  • Deleted
    sexta-feira, 16 de agosto de 2013 12:42