none
Query fra 2 tabelle RRS feed

  • Domanda

  • Ciao a tutti,

    mi sto avvicinando adesso al linguaggio di SQL.

    Ho un problema di questo tipo:

    2 tabelle 

    ATTDocRighe

    ATTDocCoda

    correlate dall'IDCod

    Ho fatto questa select

                                   

    SQL SELECT 
    CodArt,
    CostoUnitario,
    Descrizione,
    IdDoc,
    IdRiga,
    ImponibileVB,
    Qta,
    CodLotto,
    TipoDocumento
    FROM ATTDocRighe
    WHERE TipoDocumento in (4,5)
    AND TipoRiga<>3;

    LEFT JOIN

    SQL SELECT
        IdDoc,
        SpeseBolli
    FROM ATTDocCoda
    WHERE IdDoc ?????;

    Ho messo dei punti di domanda perchè vorrei che il risultato della seconda SELECT prendesse IdDoc che però hanno TipoDocumento =(4,5) mentre nella tabella ATTDocCoda ci sono anche altri tipi di documenti oltre il 4 e il 5. Grazie                

    giovedì 23 gennaio 2014 17:20

Risposte

  • Ciao,

    spero di aver capito bene. Quando si fanno quesiti di questo tipo sarebbe meglio dare un'idea dei dati che hai e di quelli che vorresti in output. Comunque, proviamoci per sta volta :)

    I dati che ho creato sono i seguenti, sul tempdb:

    USE tempdb;
    GO
    
    CREATE TABLE #ATTDocRighe
    (
          CodArt int
        , CostoUnitario decimal(9, 2)
        , Descrizione varchar(100)
        , IdDoc int
        , IdRiga int IDENTITY(1, 1) PRIMARY KEY
        , ImponibileVB decimal(9, 2)
        , Qta decimal(9, 2)
        , CodLotto varchar(10)
        , TipoDocumento tinyint
    );
    GO
    
    CREATE TABLE #ATTDocCoda
    (
          IdDoc int PRIMARY KEY
        , SpeseBolli decimal(9, 2)
    );
    GO
    
    INSERT INTO #ATTDocRighe (CodArt, CostoUnitario, Descrizione, IdDoc, ImponibileVB, Qta, CodLotto, TipoDocumento)
    VALUES (1, 10, 'UNO', 1, 20, 5, 'CODUNO', 4);
    INSERT INTO #ATTDocRighe (CodArt, CostoUnitario, Descrizione, IdDoc, ImponibileVB, Qta, CodLotto, TipoDocumento)
    VALUES (2, 10, 'DUE', 1, 40, 15, 'CODDUE', 5);
    INSERT INTO #ATTDocRighe (CodArt, CostoUnitario, Descrizione, IdDoc, ImponibileVB, Qta, CodLotto, TipoDocumento)
    VALUES (3, 10, 'TRE', 2, 60, 25, 'CODTRE', 5);
    INSERT INTO #ATTDocRighe (CodArt, CostoUnitario, Descrizione, IdDoc, ImponibileVB, Qta, CodLotto, TipoDocumento)
    VALUES (4, 10, 'QUATTRO', 1, 20, 5, 'COD4', 1);
    INSERT INTO #ATTDocRighe (CodArt, CostoUnitario, Descrizione, IdDoc, ImponibileVB, Qta, CodLotto, TipoDocumento)
    VALUES (5, 10, 'CINQUE', 1, 20, 5, 'COD5', 2);
    INSERT INTO #ATTDocRighe (CodArt, CostoUnitario, Descrizione, IdDoc, ImponibileVB, Qta, CodLotto, TipoDocumento)
    VALUES (6, 10, 'SEI', 4, 20, 5, 'COD6', 5);
    
    INSERT INTO #ATTDocCoda (IdDoc, SpeseBolli)
    VALUES (1, 10);
    INSERT INTO #ATTDocCoda (IdDoc, SpeseBolli)
    VALUES (2, 20);
    
    SELECT * FROM #ATTDocRighe;
    /*
    CodArt      CostoUnitario                           Descrizione                                                                                          IdDoc       IdRiga      ImponibileVB                            Qta                                     CodLotto   TipoDocumento
    ----------- --------------------------------------- ---------------------------------------------------------------------------------------------------- ----------- ----------- --------------------------------------- --------------------------------------- ---------- -------------
    1           10.00                                   UNO                                                                                                  1           1           20.00                                   5.00                                    CODUNO     4
    2           10.00                                   DUE                                                                                                  1           2           40.00                                   15.00                                   CODDUE     5
    3           10.00                                   TRE                                                                                                  2           3           60.00                                   25.00                                   CODTRE     5
    4           10.00                                   QUATTRO                                                                                              1           4           20.00                                   5.00                                    COD4       1
    5           10.00                                   CINQUE                                                                                               1           5           20.00                                   5.00                                    COD5       2
    6           10.00                                   SEI                                                                                                  4           6           20.00     
    */
    
    SELECT * FROM #ATTDocCoda;
    /*
    IdDoc       SpeseBolli
    ----------- ---------------------------------------
    1           10.00
    2           20.00
    */

    basandomi su di essi ti ho scritto una query che, oltre che filtrare i tipi di documento che ti servono, ti fa notare cosa succede nel caso in cui non esista un IdDoc in #ATTDocCoda. Come vedi, nel campo SpeseBolli troverai NULL poiché il documento non è presente nella tabella di "destra". La query è la seguente, spero possa essere quello che ti serve:

    SELECT
    	    R.CodArt
    	  , R.CostoUnitario
    	  , R.Descrizione
    	  , R.IdDoc
    	  , R.IdRiga
    	  , R.ImponibileVB
    	  , R.Qta
    	  , R.CodLotto
    	  , R.TipoDocumento
    	  , C.SpeseBolli
    FROM
    	#ATTDocRighe			R
    	LEFT JOIN #ATTDocCoda	C ON R.IdDoc = C.IdDoc
    WHERE
    	R.TipoDocumento IN (4, 5);
    /*
    CodArt      CostoUnitario                           Descrizione                                                                                          IdDoc       IdRiga      ImponibileVB                            Qta                                     CodLotto   TipoDocumento SpeseBolli
    ----------- --------------------------------------- ---------------------------------------------------------------------------------------------------- ----------- ----------- --------------------------------------- --------------------------------------- ---------- ------------- ---------------------------------------
    1           10.00                                   UNO                                                                                                  1           1           20.00                                   5.00                                    CODUNO     4             10.00
    2           10.00                                   DUE                                                                                                  1           2           40.00                                   15.00                                   CODDUE     5             10.00
    3           10.00                                   TRE                                                                                                  2           3           60.00                                   25.00                                   CODTRE     5             20.00
    6           10.00                                   SEI                                                                                                  4           6           20.00                                   5.00                                    COD6       5             NULL
    */


    Alessandro Alpi SQL Server MVP


    venerdì 24 gennaio 2014 13:37
    Moderatore