locked
Ajuda com WHERE RRS feed

  • Pergunta

  • é o seguinte galera:

    tenho duas tabelas, uma com o campo KEYWORD (tabela1), e outra com o campo CODIGO (tabela2):

    preciso saber, quais os registros da tabela1, tem o campo KEYWORD, DIFERENTE da tabela2.

    Tabela1, vem de uma importacao do Excel, tem o campo KEYWORD, varchar(8);

    Tabela2, veio importada de outro banco, com o campo CODIGO varchar(8);

    Até ai, tudo certo:

    Fiz um teste,
    select * from Tabela1 where codigo = 'SFC-0027'

    select * from Tabela2 where KeyWord = 'SFC-0027'

    e ele me retornou dados nas duas queries, ou seja, os dados são iguais.

    Quando vou fazer assim:

    select distinct A.KeyWord
    FROM Tabela1 A, tabela2 B
    where not A.KeyWord = B.codigo

    ele retorna um erro: Cannot resolve collation conflict for not equal to operation.

    Entao, usei o select assim

    where not A.KeyWord COLLATE Latin1_General_BIN like B.codigo COLLATE Latin1_General_BIN

    Mas, nao sei pq raios, ele retorna o valor SFC-0027 como se fosse diferente da tabela1 para a tabela2

    Estou quase chorando ja, sera que alguem pode me ajudar ????

    Valeu

    Eduardo Portescheller
    eduardo.portescheller@eds.com
    segunda-feira, 10 de março de 2008 18:09

Respostas

  • Eduardo, segue outro exemplo:

     

    Code Snippet

    Select Distinct A.Call, A.Inbox, A.Keyword, A.EDS_Code

    From ProFev2008 A

    Where A.Keyword Not In (Select B.Keyword From Pro B)

    And A.EDS_Code Not In (Select C.Eds_Code From Pro C)

     

     

    Espero ter ajudado!

     

    Abraços,

    terça-feira, 11 de março de 2008 21:14

Todas as Respostas

  • Portescheller,

     

    Já tentou utilizar algum join?

     

    Code Snippet

    select distinct A.KeyWord
    FROM Tabela1 A Inner Join tabela2 B

                               on A.KeyWord = B.codigo

     

     

     

     

    segunda-feira, 10 de março de 2008 19:19
    Moderador
  • sim, ja tentei assim:

    select distinct A.KeyWord
    FROM ProFevereiro2008 A Inner Join PRO_CONS B
    on not A.KeyWord COLLATE Latin1_General_BIN = B.codigo COLLATE Latin1_General_BIN



    mas mesmo assim nao da, ele continua mostrando que o valor que é IGUAL nas duas tabelas, como diferente...

    alguma outra ideia ?

    Obrigado.
    segunda-feira, 10 de março de 2008 19:29
  • Eduardo,

     

    O Collation dos dois campos estão iguais, em ambas tabelas?

     

    Você pode verificar pelo sp_help 'nometabela'

     

    Pelo que entendi, você quer verificar todos os Keyword que estão na Tabela1 que não estão na Tabela2, certo?

     

    Segue um outro exemplo de query:

     

    Code Snippet

    Select Distinct A.KeyWord

    From Tabela1 A

    Where A.Keyword Not In (Select Distinct B.Keyword From Tabela2 B)

     

     

    Espero que te ajude!

     

    Abraços,

    terça-feira, 11 de março de 2008 14:17
  • Fernando, bom dia !

    Valeu pela dica
    Realmente estao diferentes:

    sp_help 'ProFevereiro2008' --Latin1_General_CI_AS
    sp_help 'PRO_CONS' -- SQL_Latin1_General_CP1_CI_AS

    Agora, como faço para deixa-las com o mesmo COLLATION ?

    TKS

    Eduardo.
    terça-feira, 11 de março de 2008 15:27
  • Portescheller,

     

    Através da ferramenta de designer de tables existentes no SQL Server você pode alterar o collate, ou se preferir veja este exemplo:

     

    Code Snippet

    Create TAble Teste

    (Descricao VarChar(10) Collate Latin1_General_CI_AS)

     

    Alter TAble teste

    Alter Column Descricao VarChar(10) Collate SQL_Latin1_General_CP1_CI_AS

     

     

     

    Lógicamente tome cuidado para fazer esta conversão de valores, pois dependendo do collate escolhido poderá representar uma possível incompatibilidade de dados.
    terça-feira, 11 de março de 2008 17:36
    Moderador
  • Opa, então qual das tabelas que é a real de produção?

     

    Vou mandar um exemplo:

     

    Code Snippet

    CREATE TABLE #TesteC (nome varchar(10) COLLATE Latin1_General_CI_AS,

    nome2 varchar(10) COLLATE SQL_Latin1_General_CP1_CI_AS)

     

    Insert #TesteC Values ('Teste', 'Teste')

     

    Alter Table #TesteC

    Alter Column nome2 varchar(10) COLLATE Latin1_General_CI_AS

     

     

    Qualquer dúvida, retorne.

     

    Abraços,

    terça-feira, 11 de março de 2008 17:39
  • deixa te mostrar o que fiz agora:

    tenho a tabela:

    Tabela ProFev2008
    CALL                        INBOX                 KEYWORD         EDS_CODE
    401-01-4466023         RDM - VRDB        NULL                  NULL
    401-01-4466024         HD - VRDB           CRP-0001           NULL

    Tabela PRO
    CODIGO
    CRP-0001
    CRP-0002
    CRP-0003

    Agora, preciso saber, na tabela ProFev2008, quais os registros que tem os valores KEYWORD e EDS_CODE
    diferentes
    da tabela PRO

    fiz o seguinte:

    select distinct A.Call, A.Inbox,
    A.KeyWord, A.EDS_Code
    FROM ProFev2008 A Inner Join PRO B
    on (A.KeyWord <> B.codigo)
    and
    (A.EDS_Code <> B.codigo)

    Ele a tabela ProFev2008, tem 43 mil e poucos registros, e a tabela PRO, 3 mil e poucos

    Mas neste exemplo, ele deveria mostrar apenas a linha 1, certo ?

    Mas ele ta mostrando a linha dois tambem, mas a porcaria do CRP-0001 é igual nas duas, portanto nao deveria aparecer.

    Mas essa porra esta me deixando louco, e esta aparecendo !

    To fazendo algo de errado ???

    Valeu

    (a parte dos COLLATE, eu ja arrumei, as duas tabelas estao com o COLLATE Latin1_General_CI_AS)







    terça-feira, 11 de março de 2008 19:31
  • Eduardo, segue outro exemplo:

     

    Code Snippet

    Select Distinct A.Call, A.Inbox, A.Keyword, A.EDS_Code

    From ProFev2008 A

    Where A.Keyword Not In (Select B.Keyword From Pro B)

    And A.EDS_Code Not In (Select C.Eds_Code From Pro C)

     

     

    Espero ter ajudado!

     

    Abraços,

    terça-feira, 11 de março de 2008 21:14
  • Também se pode converter o collate antes de fazer a comparação assim não é necessário alterar as tabelas:

    http://msdn2.microsoft.com/en-us/library/ms187928.aspx "procurar: collate"
    SELECT CAST('abc' AS varchar(5)) COLLATE Collate_Desejado
    segunda-feira, 24 de março de 2008 13:37