Jump to content
ruimcosta

Sql Server. Problema com joins

Recommended Posts

ruimcosta

Boa tarde,

Tenho duas tabelas que tem como chaves 4 campos. Preciso de listar os 4 campos da tabela1 + 1 campo da tabela 2 de modo que os 4 campos da tabela 1 sejam iguais aos 4 campos da tabela 2. qualquer coisa deste género:

SELECT  ANO, TERCEIRO, TPDOC, CAST(NNUMDOC AS integer) AS NNUMDOC, SERIE
FROM DOCGCCAB 
INNER JOIN IMPRESSA LEFT JOIN 
ON 
	DOCGCCAB.SERIE = IMPRESSA.SERIE AND 
	DOCGCCAB.ANO = IMPRESSA.ANO AND
	DOCGCCAB.TPDOC = IMPRESSA.TPDOC AND
	DOCGCCAB.NNUMDOC = IMPRESSA.NUMDOC
WHERE TPDOC = 'FT' OR TPDOC = 'NC' OR TPDOC = 'ND'  OR TPDOC = 'GT' OR TPDOC = 'GR' OR TPDOC = 'VD'
ORDER BY ANO DESC, TERCEIRO DESC, TPDOC DESC, NNUMDOC DESC, SERIE ASC;

Já sei que o AND no left join nao funciona, mas penso que da para perceber a logica da coisa.

Desde já o meu obrigado

Rui Costa


Abraços e beijinhos,Rui Costa

Share this post


Link to post
Share on other sites
ruimcosta

Biba,

Já efectuei algumas alterações para este script:

SELECT  DOCGCCAB.ANO, DOCGCCAB.TERCEIRO, DOCGCCAB.TPDOC, CAST(DOCGCCAB.NNUMDOC AS integer) AS NNUMDOC, DOCGCCAB.SERIE
FROM DOCGCCAB 
LEFT JOIN IMPRESSA AS SERIE1 ON 
	DOCGCCAB.SERIE = IMPRESSA.SERIE 
LEFT JOIN IMPRESSA AS ANO1 ON
	DOCGCCAB.ANO = IMPRESSA.ANO
LEFT JOIN IMPRESSA AS TPDOC1 ON 
	DOCGCCAB.TPDOC = IMPRESSA.TPDOC
LEFT JOIN IMPRESSA AS NUMDOC1 ON 
	DOCGCCAB.NNUMDOC = IMPRESSA.NUMDOC
WHERE DOCGCCAB.TPDOC = 'FT' OR DOCGCCAB.TPDOC = 'NC' OR DOCGCCAB.TPDOC = 'ND'  OR DOCGCCAB.TPDOC = 'GT' OR DOCGCCAB.TPDOC = 'GR' OR DOCGCCAB.TPDOC = 'VD'
ORDER BY DOCGCCAB.ANO DESC, DOCGCCAB.TERCEIRO DESC, DOCGCCAB.TPDOC DESC, DOCGCCAB.NNUMDOC DESC, DOCGCCAB.SERIE ASC;

Dá a seguinte mensagem de erro:

Msg 4104, Level 16, State 1, Line 1

The multi-part identifier "IMPRESSA.SERIE" could not be bound.

Msg 4104, Level 16, State 1, Line 1

The multi-part identifier "IMPRESSA.ANO" could not be bound.

Msg 4104, Level 16, State 1, Line 1

The multi-part identifier "IMPRESSA.TPDOC" could not be bound.

Msg 4104, Level 16, State 1, Line 1

The multi-part identifier "IMPRESSA.NUMDOC" could not be bound.

Podem ajudar-me na resolução deste script? Obrigado.


Abraços e beijinhos,Rui Costa

Share this post


Link to post
Share on other sites
Rechousa

Olá,

Experimenta assim:

SELECT DOCGCCAB.ANO, DOCGCCAB.TERCEIRO, DOCGCCAB.TPDOC, CAST(DOCGCCAB.NNUMDOC AS integer) AS NNUMDOC, DOCGCCAB.SERIE
    FROM DOCGCCAB
    LEFT JOIN IMPRESSA ON
                DOCGCCAB.SERIE = IMPRESSA.SERIE AND
                DOCGCCAB.ANO = IMPRESSA.ANO AND
                DOCGCCAB.TPDOC = IMPRESSA.TPDOC AND
                DOCGCCAB.NNUMDOC = IMPRESSA.NUMDOC
    WHERE DOCGCCAB.TPDOC IN ('FT', 'NC', 'ND', 'GT', 'GR', 'VD')
    ORDER BY DOCGCCAB.ANO DESC, DOCGCCAB.TERCEIRO DESC, DOCGCCAB.TPDOC DESC, DOCGCCAB.NNUMDOC DESC, DOCGCCAB.SERIE ASC;


Pedro Martins

Sharing is Knowledge!

http://www.linkedin.com/in/rechousa

Share this post


Link to post
Share on other sites
ruimcosta

Biba Rechousa,

Obrigado. Deu certo, mas agora (Os meus neurónios hoje já estão em sobreaquecimento) pretendo acrescentar uma clausula que retorne apenas os registos em que um campo tenha NULL ou esteja vazio:

SELECT IMPRESSA.CERT, DOCGCCAB.ANO, DOCGCCAB.TERCEIRO, DOCGCCAB.TPDOC, CAST(DOCGCCAB.NNUMDOC AS integer) AS NNUMDOC, DOCGCCAB.SERIE
    FROM DOCGCCAB
    LEFT JOIN IMPRESSA ON
                DOCGCCAB.SERIE = IMPRESSA.SERIE AND
                DOCGCCAB.ANO = IMPRESSA.ANO AND
                DOCGCCAB.TPDOC = IMPRESSA.TPDOC AND
                DOCGCCAB.NNUMDOC = IMPRESSA.NUMDOC
    WHERE DOCGCCAB.TPDOC IN ('FT', 'NC', 'ND', 'GT', 'GR', 'VD') AND IMPRESSA.CERT IS NULL
    ORDER BY DOCGCCAB.ANO DESC, DOCGCCAB.TERCEIRO DESC, DOCGCCAB.TPDOC DESC, DOCGCCAB.NNUMDOC DESC, DOCGCCAB.SERIE ASC;

Se ficar apenas assim, funciona, mas se lhe acrescentar:

SELECT IMPRESSA.CERT, DOCGCCAB.ANO, DOCGCCAB.TERCEIRO, DOCGCCAB.TPDOC, CAST(DOCGCCAB.NNUMDOC AS integer) AS NNUMDOC, DOCGCCAB.SERIE
    FROM DOCGCCAB
    LEFT JOIN IMPRESSA ON
                DOCGCCAB.SERIE = IMPRESSA.SERIE AND
                DOCGCCAB.ANO = IMPRESSA.ANO AND
                DOCGCCAB.TPDOC = IMPRESSA.TPDOC AND
                DOCGCCAB.NNUMDOC = IMPRESSA.NUMDOC
    WHERE DOCGCCAB.TPDOC IN ('FT', 'NC', 'ND', 'GT', 'GR', 'VD') AND IMPRESSA.CERT IS NULL AND IMPRESSA.CERT = ""
    ORDER BY DOCGCCAB.ANO DESC, DOCGCCAB.TERCEIRO DESC, DOCGCCAB.TPDOC DESC, DOCGCCAB.NNUMDOC DESC, DOCGCCAB.SERIE ASC;

Dá este erro:

Msg 1038, Level 15, State 4, Line 8

An object or column name is missing or empty. For SELECT INTO statements, verify each column has a name. For other statements, look for empty alias names. Aliases defined as "" or [] are not allowed. Add a name or single space as the alias name.

Obrigado pela ajuda.


Abraços e beijinhos,Rui Costa

Share this post


Link to post
Share on other sites
ruimcosta

Obrigado.

Está resolvido, quando os neurónios aquecem em demasia já não se vê direito:

estava a usar aspas em vez das ''.


Abraços e beijinhos,Rui Costa

Share this post


Link to post
Share on other sites
Rechousa

Mas não deve funcionar pois, para um registo, o campo CERT nunca pode ter dois valores (NULL e '')

Tens de substituir o AND por um OR:

SELECT IMPRESSA.CERT, DOCGCCAB.ANO, DOCGCCAB.TERCEIRO, DOCGCCAB.TPDOC, CAST(DOCGCCAB.NNUMDOC AS integer) AS NNUMDOC, DOCGCCAB.SERIE
    FROM DOCGCCAB
    LEFT JOIN IMPRESSA ON
                DOCGCCAB.SERIE = IMPRESSA.SERIE AND
                DOCGCCAB.ANO = IMPRESSA.ANO AND
                DOCGCCAB.TPDOC = IMPRESSA.TPDOC AND
                DOCGCCAB.NNUMDOC = IMPRESSA.NUMDOC
    WHERE DOCGCCAB.TPDOC IN ('FT', 'NC', 'ND', 'GT', 'GR', 'VD') AND (IMPRESSA.CERT IS NULL OR IMPRESSA.CERT = '')
    ORDER BY DOCGCCAB.ANO DESC, DOCGCCAB.TERCEIRO DESC, DOCGCCAB.TPDOC DESC, DOCGCCAB.NNUMDOC DESC, DOCGCCAB.SERIE ASC;

Experimenta e dá feedback.


Pedro Martins

Sharing is Knowledge!

http://www.linkedin.com/in/rechousa

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.