none
query per visualizzare tutti i record con un campo bit calcolato RRS feed

  • Domanda

  • salve a tutti,

    ho una tabella articoli (IDarticolo e DescrizioneArticolo) e una tabella liste (IdLista, DescrizioneLista)

    e in fine una tabella indice (IdArticolo, IdLista) che lega in relazione uno a molti le due tabelle.

    Ho bisogno di creare una sp che prendendo come parametro IdLista, mi ritorni sempre TUTTI gli articoli e aggiunga un campo di tipo bit che mi dice se quell'articolo è presente o meno nella lista.

    Avete suggerimenti su come fare?

    Grazie


    Diego Riccardi

    giovedì 14 febbraio 2013 14:43

Risposte

  • ciao,

    Personalmente creerei un campo bit al volo, prova a vedere se questo codice può aiutarti:

    USE tempdb;
    GO
    
    CREATE TABLE #Articoli
    (
    	  IDArticolo int NOT NULL PRIMARY KEY
    	, DescrizioneArticolo varchar(50) NOT NULL
    );
    GO
    
    CREATE TABLE #Liste
    (
    	  IDLista int NOT NULL PRIMARY KEY
    	, DescrizioneLista varchar(50) NOT NULL
    );
    GO
    
    CREATE TABLE #Indice
    (
    	  IDArticolo int NOT NULL
    	, IDLista int NOT NULL
        , CONSTRAINT pk_indice PRIMARY KEY
    	(
    		  IDArticolo
    		, IDLista
    	)  
    );
    GO
    
    
    INSERT INTO #Articoli ( IDArticolo, DescrizioneArticolo )
    VALUES 
    	  (1, 'Pasta')
    	, (2, 'Frutta')
    	, (3, 'Verdura')
    	, (4, 'Carne')
    	, (5, 'Pesce')
    	, (6, 'Dolci')
    	, (7, 'Amari')
    	, (8, 'Pane')
    GO
    
    INSERT INTO #Liste ( IDLista, DescrizioneLista )
    VALUES 
    	  (1, 'Proteine')
    	, (2, 'Zuccheri semplici')
    	, (3, 'Zuccheri complessi')
    GO
    
    INSERT INTO #Indice ( IDArticolo, IDLista )
    VALUES
            (4, 1)
    	  , (5, 1)
    	  , (2, 2)
    	  , (6, 2)
    	  , (1, 3)
    	  , (8, 3)
    GO
    
    -- ricavo tutti gli articoli indipendentemente dalla lista passata 
    -- e determino la presenza degli articoli stessi nella lista passata
    
    CREATE PROCEDURE dbo.proc_ArticoliPerLista
    	@IDLista int
    AS
    BEGIN
    
    	SET NOCOUNT ON;
    
    
    
    	SELECT
    		  A.DescrizioneArticolo
    		, PresenteInLista			= CAST(CASE WHEN I.IDArticolo IS NULL THEN 0 ELSE 1 END AS bit)
    	FROM
    		#Articoli				A  
    		LEFT JOIN #Indice		I ON I.IDArticolo	= A.IDArticolo
    		LEFT JOIN #Liste		L ON I.IDLista		= L.IDLista AND L.IDLista = @IDLista;
    
    END;  
    GO
    
    
    EXEC dbo.proc_ArticoliPerLista 1;
    GO
    
    
    DROP TABLE #Indice;
    DROP TABLE #Articoli;
    DROP TABLE #Liste;
    DROP PROCEDURE dbo.proc_ArticoliPerLista;
    GO



    Alessandro Alpi SQL Server MVP

    venerdì 15 febbraio 2013 13:49
    Moderatore

Tutte le risposte

  • Prima crei la colonna nella tabella indice e poi fai una left join

    alter table indice
    Add presente bit not null

    select articoli.Idarticolo, articoli.DescrizioneArticolo, presente
    FROM articoli  left JOIN indice
    ON articoli.idarticolo = indice.idarticolo 

    giovedì 14 febbraio 2013 17:05
  • ciao,

    Personalmente creerei un campo bit al volo, prova a vedere se questo codice può aiutarti:

    USE tempdb;
    GO
    
    CREATE TABLE #Articoli
    (
    	  IDArticolo int NOT NULL PRIMARY KEY
    	, DescrizioneArticolo varchar(50) NOT NULL
    );
    GO
    
    CREATE TABLE #Liste
    (
    	  IDLista int NOT NULL PRIMARY KEY
    	, DescrizioneLista varchar(50) NOT NULL
    );
    GO
    
    CREATE TABLE #Indice
    (
    	  IDArticolo int NOT NULL
    	, IDLista int NOT NULL
        , CONSTRAINT pk_indice PRIMARY KEY
    	(
    		  IDArticolo
    		, IDLista
    	)  
    );
    GO
    
    
    INSERT INTO #Articoli ( IDArticolo, DescrizioneArticolo )
    VALUES 
    	  (1, 'Pasta')
    	, (2, 'Frutta')
    	, (3, 'Verdura')
    	, (4, 'Carne')
    	, (5, 'Pesce')
    	, (6, 'Dolci')
    	, (7, 'Amari')
    	, (8, 'Pane')
    GO
    
    INSERT INTO #Liste ( IDLista, DescrizioneLista )
    VALUES 
    	  (1, 'Proteine')
    	, (2, 'Zuccheri semplici')
    	, (3, 'Zuccheri complessi')
    GO
    
    INSERT INTO #Indice ( IDArticolo, IDLista )
    VALUES
            (4, 1)
    	  , (5, 1)
    	  , (2, 2)
    	  , (6, 2)
    	  , (1, 3)
    	  , (8, 3)
    GO
    
    -- ricavo tutti gli articoli indipendentemente dalla lista passata 
    -- e determino la presenza degli articoli stessi nella lista passata
    
    CREATE PROCEDURE dbo.proc_ArticoliPerLista
    	@IDLista int
    AS
    BEGIN
    
    	SET NOCOUNT ON;
    
    
    
    	SELECT
    		  A.DescrizioneArticolo
    		, PresenteInLista			= CAST(CASE WHEN I.IDArticolo IS NULL THEN 0 ELSE 1 END AS bit)
    	FROM
    		#Articoli				A  
    		LEFT JOIN #Indice		I ON I.IDArticolo	= A.IDArticolo
    		LEFT JOIN #Liste		L ON I.IDLista		= L.IDLista AND L.IDLista = @IDLista;
    
    END;  
    GO
    
    
    EXEC dbo.proc_ArticoliPerLista 1;
    GO
    
    
    DROP TABLE #Indice;
    DROP TABLE #Articoli;
    DROP TABLE #Liste;
    DROP PROCEDURE dbo.proc_ArticoliPerLista;
    GO



    Alessandro Alpi SQL Server MVP

    venerdì 15 febbraio 2013 13:49
    Moderatore