Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Jedais Júnior

Query em relacionamento 1:N

Recommended Posts

Boa tarde,

 

Estou com uma dificuldade em fazer um select quando o relacionamento das tabelas é N:N.

 

Ex: Tenho duas tabelas (Notas Fiscais as N e Ocorrências as O). Cada nota fiscal pode ter mais de uma ocorrência conforme abaixo:

NOTA_FISCAL    OCORRÊNCIAS

111111                00001
111111                00002
111111                00101
222222                00002
333333                00005
Preciso consultar o número da nota fiscal e as ocorrências associadas a ela, somente com código '00001' e '00101'. Ou seja:
NOTA_FISCAL    OCORRÊNCIAS

111111                00001
111111                00101
Porém, quando executo essa consulta o SQL Server 2008 me exibe o erro:
"A subconsulta retornou mais de 1 valor. Isso não é permitido quando a subconsulta segue um =, !=, <, <= , >, >= ou quando ela é usada como uma expressão."
Podem me ajudar?
Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vc deve estar fazendo a sub com "=" faça com "IN"

 

Se não resolver publica e query.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Motta, obrigado pela resposta, mas não manjo mto de sql, logo, não entendi direito onde usar o IN. Segue query abaixo. Acredito q não é a melhor maneira de fazer essa consulta, logo, aceito sugestões :joia: .

SELECT  (P.NOCGCCPF) AS CNPJ_CLIENTE,

        (P.NMPARCEIROCOMERCIAL) AS CLIENTE,
        (SELECT O2.NMSOLICITANTE FROM GKOSCF.FMOCORRE AS O2
           INNER JOIN GKOSCF.FCTPOOCO TPO ON TPO.IDTIPOOCORRENCIA = O2.IDTIPOOCORRENCIA
WHERE O2.IDMOVIMENTO = N.IDNOTA AND TPO.CDTIPOOCORRENCIA = '00001' OR
                                    TPO.CDTIPOOCORRENCIA = '00100' OR
                                    TPO.CDTIPOOCORRENCIA = '00101') AS SOLICITANTE,
        (SELECT TPO.DSTIPOOCORRENCIA FROM GKOSCF.FMOCORRE AS O2
           INNER JOIN GKOSCF.FCTPOOCO TPO ON TPO.IDTIPOOCORRENCIA = O2.IDTIPOOCORRENCIA
WHERE O2.IDMOVIMENTO = N.IDNOTA AND TPO.CDTIPOOCORRENCIA = '00001' OR
                                    TPO.CDTIPOOCORRENCIA = '00100' OR
                                    TPO.CDTIPOOCORRENCIA = '00101') AS DESCRIÇAO_OCORRENCIA,
        (SELECT TPO.CDTIPOOCORRENCIA FROM GKOSCF.FMOCORRE AS O2
           INNER JOIN GKOSCF.FCTPOOCO TPO ON TPO.IDTIPOOCORRENCIA = O2.IDTIPOOCORRENCIA
WHERE O2.IDMOVIMENTO = N.IDNOTA AND TPO.CDTIPOOCORRENCIA = '00001' OR
                                    TPO.CDTIPOOCORRENCIA = '00100' OR
                                    TPO.CDTIPOOCORRENCIA = '00101') AS CODIGO_OCORRENCIA,
        (SELECT CONVERT (VARCHAR,O2.DTOCORRENCIA,103) FROM GKOSCF.FMOCORRE AS O2
           INNER JOIN GKOSCF.FCTPOOCO TPO ON TPO.IDTIPOOCORRENCIA = O2.IDTIPOOCORRENCIA
WHERE O2.IDMOVIMENTO = N.IDNOTA AND TPO.CDTIPOOCORRENCIA = '00001' OR
                                    TPO.CDTIPOOCORRENCIA = '00100' OR
                                    TPO.CDTIPOOCORRENCIA = '00101') AS DATA_OCORRENCIA,
        (N.CDNOTA) AS NOTA_FISCAL,
        (N.CDSERIE) AS SERIE_NF,
CONVERT (VARCHAR,N.DTEMISSAO,103) AS DATA_EMISSAO_NF,
        (E.CDROMANEIO) AS EMBARQUE_NF,
        (T.DSAPELIDOTRANSPORTADORA) AS TRANSPORTADORA,
        (SELECT R.CDREMESSA FROM GKOSCF.FMREMESS AS R
           INNER JOIN GKOSCF.FMROMANE E ON R.IDREMESSA = E.IDREMESSA) AS REMESSA,
CONVERT (VARCHAR,D.DTENTREGACALCULADA,103) AS PREVISAO_ENTREGA
FROM GKOSCF.FMNOTA AS N
           INNER JOIN GKOSCF.FCPARCOM AS P
ON N.IDPARDESTREMET = P.IDPARCEIROCOMERCIAL
           INNER JOIN GKOSCF.FCTRANSP AS T
ON N.IDTRANSPORTADORA = T.IDTRANSPORTADORA
           INNER JOIN GKOSCF.FMROMANE AS E
ON N.IDROMANEIO = E.IDROMANEIO
           INNER JOIN GKOSCF.FMNTAEMB AS D
ON N.IDNOTA = D.IDNOTA
WHERE N.DTEMISSAO >= '28/07/2012' AND
      N.DTEMISSAO <= '30/07/2012'
ORDER BY N.CDNOTA ASC

Compartilhar este post


Link para o post
Compartilhar em outros sites

No caso os subselects estão sendo usados como coluna , vale a mesma regra , só uma linha pode ser retornada.

 

Não tenho coragem de tentar entender esta query, quanto mais mudá-la, mas

 

faça a query uma vez para cada coluna destas de subselect comentando as demais colunas até achar a query que está dando problema.

 

Está query já era executada ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Motta,

 

Se a nota fiscal possui somente uma ocorrência (1:1) a query é executada corretamente.

 

Se comento os quatro sub selects a query também é executada corretamente.

 

Será q terei q desmembrar as query para retornar o resultado para um tipo de ocorrência por vez (00001 depois 00100 e depois 00101)??

 

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O que costumo fazer em queries que ficam assim :

 

 

faça outra do zero, mudando a abordagem

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.