none
uso di viste SQL RRS feed

  • Domanda

  • salve

    ho un dubbio: se creo una vista SQL con 2 tabelle correlate

    TAB1 --> prodotto

    • idProdotto
    • DataCreazione
    • IDCLiente

    Tab2 --> Clienti

    • IdCliente
    • RagioneSociale

    in modo da avere

    SELECT Prodotti.idProdotto,
           Prodotti.DataProduzione,
           Prodotti.IdCliente,
           Clienti.RagioneSociale
    FROM Clienti RIGHT JOIN Prodotti ON Clienti.IDCliente = Prodotti.IdCliente

    e' possibile aprire la vista e modificare o inserire nuovi record popolando i campi relativi alla tabella prodotti ? grazie

    mercoledì 14 aprile 2021 10:55

Risposte

  • Ciao,

    si è possibile in quanto sono rispettate le regole di aggiornabilità: i campi modificati appartengono ad una sola tabella sottostante.

    Giorgio

    mercoledì 14 aprile 2021 20:19
  • Ciao,

    a supporto della risposta corretta di Giorgio e per chiarire ogni dubbio riporto di seguito un esempio:

    DROP TABLE IF EXISTS dbo.Clienti; DROP TABLE IF EXISTS dbo.Prodotti; DROP VIEW IF EXISTS dbo.vwClientiProdotti; GO CREATE TABLE dbo.Prodotti ( IDProdotto INTEGER IDENTITY(1, 1) NOT NULL ,DataCreazione DATETIME NOT NULL ,IDCliente INTEGER ); CREATE TABLE dbo.Clienti ( IDCliente INTEGER IDENTITY (1,1) NOT NULL ,RagioneSociale NVARCHAR(256) NOT NULL ); INSERT INTO dbo.Clienti ( RagioneSociale ) VALUES ( 'Sergio Govoni' ); INSERT INTO dbo.Prodotti ( DataCreazione ,IDCliente ) VALUES ( GETDATE() ,1 ); GO CREATE VIEW dbo.vwClientiProdotti AS SELECT Prodotti.IDProdotto ,Prodotti.DataCreazione ,Prodotti.IDCliente ,Clienti.RagioneSociale FROM dbo.Clienti RIGHT JOIN dbo.Prodotti ON Clienti.IDCliente = Prodotti.IDCliente; GO SELECT * FROM dbo.vwClientiProdotti; UPDATE dbo.vwClientiProdotti SET RagioneSociale = 'Mario Rossi' WHERE IDCliente = 1; SELECT * FROM dbo.vwClientiProdotti; -- Cleanup DROP TABLE IF EXISTS dbo.Clienti; DROP TABLE IF EXISTS dbo.Prodotti;

    DROP VIEW IF EXISTS dbo.vwClientiProdotti;


    Colgo l'occasione per segnalare questo link in cui trovate un paio di CTE che restituiscono le performance delle query contenute nelle viste all'interno di un database SQL Server.

    Ciao!


    Sergio Govoni

    Microsoft Data Platform MVP | MVP Profile | English Blog | Twitter | LinkedIn




    venerdì 16 aprile 2021 21:06
    Moderatore

Tutte le risposte

  • Ciao,

    si è possibile in quanto sono rispettate le regole di aggiornabilità: i campi modificati appartengono ad una sola tabella sottostante.

    Giorgio

    mercoledì 14 aprile 2021 20:19
  • Ciao,

    a supporto della risposta corretta di Giorgio e per chiarire ogni dubbio riporto di seguito un esempio:

    DROP TABLE IF EXISTS dbo.Clienti; DROP TABLE IF EXISTS dbo.Prodotti; DROP VIEW IF EXISTS dbo.vwClientiProdotti; GO CREATE TABLE dbo.Prodotti ( IDProdotto INTEGER IDENTITY(1, 1) NOT NULL ,DataCreazione DATETIME NOT NULL ,IDCliente INTEGER ); CREATE TABLE dbo.Clienti ( IDCliente INTEGER IDENTITY (1,1) NOT NULL ,RagioneSociale NVARCHAR(256) NOT NULL ); INSERT INTO dbo.Clienti ( RagioneSociale ) VALUES ( 'Sergio Govoni' ); INSERT INTO dbo.Prodotti ( DataCreazione ,IDCliente ) VALUES ( GETDATE() ,1 ); GO CREATE VIEW dbo.vwClientiProdotti AS SELECT Prodotti.IDProdotto ,Prodotti.DataCreazione ,Prodotti.IDCliente ,Clienti.RagioneSociale FROM dbo.Clienti RIGHT JOIN dbo.Prodotti ON Clienti.IDCliente = Prodotti.IDCliente; GO SELECT * FROM dbo.vwClientiProdotti; UPDATE dbo.vwClientiProdotti SET RagioneSociale = 'Mario Rossi' WHERE IDCliente = 1; SELECT * FROM dbo.vwClientiProdotti; -- Cleanup DROP TABLE IF EXISTS dbo.Clienti; DROP TABLE IF EXISTS dbo.Prodotti;

    DROP VIEW IF EXISTS dbo.vwClientiProdotti;


    Colgo l'occasione per segnalare questo link in cui trovate un paio di CTE che restituiscono le performance delle query contenute nelle viste all'interno di un database SQL Server.

    Ciao!


    Sergio Govoni

    Microsoft Data Platform MVP | MVP Profile | English Blog | Twitter | LinkedIn




    venerdì 16 aprile 2021 21:06
    Moderatore