Usuário com melhor resposta
INSERT INTO EM VIEW - É possível?

Pergunta
-
Bom dia,
Preciso fazer um insert em uma view, é possível?
Ou apenas copiar um registro inteiro da view e depois atualizar apenas um campo...
insert into view_clip
(codma, codac, codp, codag, codm, codper, codr, codpais, est, codabr, coded, datamat,
chamada, subt, titulo, texto, ordem, public, tam, coddest, datah, codimport, codpos, vid,
som, imagem, codim_ag, hora, codred, vis, criador, unim1, orig, codaut, numpag, ord, urlk)
select codma, codac, codp, codag, codm, codper, codr, codpais, est, codabr, coded, datamat,
chamada, subt, titulo, texto, ordem, public, tam, coddest, datah, codimport, codpos, vid,
som, imagem, codim_ag, hora, codred, vis, criador, unim1, orig, codaut, numpag, ord, urlk
from vw_clip where codma = '123456' AND codp = 'BRASIL'Estou fazendo o insert acima em uma view e da o seguinte erro:
Server: Msg 4406, Level 16, State 1, Line 1
Update or insert of view or function 'vw_clip' failed because it contains a derived or constant field.alguém sabe o que pode ser?
Obrigado!- Editado CarlosHB segunda-feira, 20 de dezembro de 2010 13:50
Respostas
-
Boa Noite,
O SQL Server assim como outros SGBDs permite o uso de comandos DML (INS, DEL e UPD) contra views. A questão é que não é qualquer view que pode ser influenciada por esses comandos. Algumas regras precisam ser impostas para tornar isso possível:
- Apenas uma tabela por vez pode ser atualizada (se a view referencia várias tabelas é possível atualizar, mas apenas uma por vez)
- Colunas calculadas não podem ser atualizadas
- A view não pode conter operadores especiais como DISTINCT e (ou) subqueriesHá outras restrições conforme o Books OnLine (procure o comando CREATE VIEW no tópico Updatable Views) e receio que sua view contenha construções proibidas. É possível retirar todas as restrições com o uso de triggers Instead Of, mas aí... Bem algo que eu não recomendaria.
O SQL Server, o DB2 e o ORACLE possuem visões materializadas diferindo apenas no nome:
SQL Server - Indexed Views
DB2 - Materialized Query Table
Oracle - Materialized ViewHá algumas restrições na construção e atualização de views materializadas do SQL Server em relação ao Oracle, mas no conceito em sua essência, não há divergências. O objetivo é materializar os dados para que as consultas sejam mais rápidas. Todos os três o fazem.
[ ]s,
Gustavo Maia Aguiar
http://gustavomaiaaguiar.spaces.live.comCompêndio de XML – Preparação para o exame 70-433 - MCTS Microsoft SQL Server 2008 - Database Development
http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!1161.entry
Classifique as respostas. O seu feedback é imprescindível- Sugerido como Resposta Gustavo Maia Aguiar segunda-feira, 27 de dezembro de 2010 04:55
- Marcado como Resposta Eder Costa segunda-feira, 3 de janeiro de 2011 16:59
-
Bom, resolvi atualizar as tabelas mesmo e deixar a view de lado, pois na view eu particularmente não consegui fazer insert nem o update...
No sql server 2008 tem views materializadas?
- Marcado como Resposta CarlosHB quinta-feira, 3 de março de 2011 20:18
Todas as Respostas
-
-
-
-
UPDATE vw_clip
SET vw_clip.codpas = 'EDITORIAIS'
WHERE (SELECT DISTINCT aclip.codmat, vw.titulo, aclip.codac, mat.codag, aclip.codpas, vw.coded, aclip.datah
FROM mate mat, acomp aclip, vw_clip vw
WHERE vw.public = 1
AND vw.codmat = aclip.codmat
AND aclip.codmat = mat.codmat
AND vw.codag = mat.codag
AND vw.codac = aclip.codac
AND vw.codpas = aclip.codpas
AND vw.coded = mat.coded
AND vw.titulo = mat.titulo
AND vw.coded = mat.coded
AND vw.codmat = '1500100'
AND aclip.codac = 'DENSO'
AND vw.codmat IN (SELECT codmat FROM vw_clip WHERE public = 1)
AND vw.datamat > '2010-11-20 05:00:00.000'
AND mat.codag IN ('CORREIO', 'FOLHA', 'ESTADO SP', 'GLOBO')
AND vw.coded IN ('EDITORIAL', 'OPINIÃO'));
Estou tentando fazer update na view no campo 'codpas' porém da erro....tem algo de errado na minha sintaxe? -
-
-
Pior que não tenho um id nas views....tentei algo assim tb para atualizar apenas o campo codpas da view, porém tb da erro...
UPDATE vw_clip
SET vw_clip.codpas = 'EDITORIAIS'
WHERE vw_clip.codpasta in (SELECT aclip.codpasta FROM mate mat, acomp aclip, vw_clip vw
WHERE vw.public = 1
AND vw.codmat = aclip.codmat
AND vw.codac = aclip.codac
AND vw.coded = mat.coded
AND vw.titulo = mat.titulo
AND vw.coded = mat.coded
AND vw.codmat = '1500100'
AND aclip.codac = 'DENSO'
AND vw.codmat IN (SELECT codmat FROM vw_clip WHERE public = 1)
AND vw.datamat > '2010-11-20 05:00:00.000'
AND mat.codag IN ('CORREIO', 'FOLHA', 'ESTADO SP', 'GLOBO')
AND vw.coded IN ('EDITORIAL', 'OPINIÃO'));
Server: Msg 4421, Level 16, State 1, Line 1
Derived table 'P' is not updatable because a column of the derived table is derived or constant. -
Faça um teste, rode apenas esse select:
SELECT aclip.codpasta FROM mate mat, acomp aclip, vw_clip vw WHERE vw.public = 1 AND vw.codmat = aclip.codmat AND vw.codac = aclip.codac AND vw.coded = mat.coded AND vw.titulo = mat.titulo AND vw.coded = mat.coded AND vw.codmat = '1500100' AND aclip.codac = 'DENSO' AND vw.codmat IN (SELECT codmat FROM vw_clip WHERE public = 1) AND vw.datamat > '2010-11-20 05:00:00.000' AND mat.codag IN ('CORREIO', 'FOLHA', 'ESTADO SP', 'GLOBO') AND vw.coded IN ('EDITORIAL', 'OPINIÃO')
.. e veja o que retorna.
-
Faça um teste, rode apenas esse select:
SELECT aclip.codpasta FROM mate mat, acomp aclip, vw_clip vw WHERE vw.public = 1 AND vw.codmat = aclip.codmat AND vw.codac = aclip.codac AND vw.coded = mat.coded AND vw.titulo = mat.titulo AND vw.coded = mat.coded AND vw.codmat = '1500100' AND aclip.codac = 'DENSO' AND vw.codmat IN (SELECT codmat FROM vw_clip WHERE public = 1) AND vw.datamat > '2010-11-20 05:00:00.000' AND mat.codag IN ('CORREIO', 'FOLHA', 'ESTADO SP', 'GLOBO') AND vw.coded IN ('EDITORIAL' , 'OPINIÃO' )
.. e veja o que retorna.
Sim, me retorna dois registros....nestes dois registros só quero atualizar o campo codpas, porém ainda não deu certo.CODPAS
1519 Exames da OAB CLIENTE FOLHA DE SP PODER JUDICIÁRIO OPINIÃO 2010-10-20 04:10:35.067
1517 Identidade atual CLIENTE O GLOBO ASSOCIAÇÕES OPINIÃO 2010-10-20 04:20:20.100O campo em negrito que preciso duplicar e atualizar para EDITORIAIS.
lembrando que a query esta rodando em cima de view. -
-
sim, o código da view abaixo:
Nesta view é utilizada mais de 5 tabelas se não me engano, todas em joins....para as queries serem feitas em cima das views...
SELECT P.codmat, P.codac, P.codpas, P.codag, P.codme, P.codper, P.codreg, P.codpais, P.estado, P.codabr, P.coded, P.datamateri, P.chamada, P.sutit, P.titulo, P.texto, P.ordemmat, P.publica, P.tammat, P.coddestaq, P.datah, P.codimport, P.codpos, P.video, P.som, (CASE WHEN ISNULL(Q.codmat, 0) > 0 THEN 1 ELSE 0 END) AS imagem, P.codimport_ag, P.hora, P.codred, P.visible, P.criado, P.unim, P.origem, P.codaut, P.numpag, P.ordemm, P.urlk, P.especial
FROM (SELECT Z.codmat, Z.codac, Z.codpas, Z.codag, Z.codme, Z.codper, Z.codreg, Z.codpais, Z.estado, Z.codabr, Z.coded,
Z.datamateri, Z.chamada, Z.sutit, Z.titulo, Z.texto, Z.ordemmat, Z.publica, Z.tammat, Z.coddestaq, Z.datah, Z.codimport,
Z.codpos, Z.video, (CASE WHEN ISNULL(W.codmat, 0) > 0 THEN 1 ELSE 0 END) AS som, Z.codimport_ag, Z.hora, Z.codred, Z.visible,
Z.criado, Z.unim, Z.origem, Z.codaut, Z.numpag, Z.ordemm, Z.urlk, Z.especial
FROM (SELECT X.codmat, X.codac, X.codpas, X.codag, X.codme, X.codper, X.codreg, X.codpais, X.estado, X.codabr, X.coded,
X.datamateri, X.chamada, X.sutit, X.titulo, X.texto, X.ordemmat, X.publica, X.tammat, X.coddestaq, X.datah,
X.codimport, X.codpos, (CASE WHEN ISNULL(Y.codmat, 0) > 0 THEN 1 ELSE 0 END) AS video, X.codimport_ag, X.hora,
X.codred, X.visible, X.criado, X.unim, X.origem, X.codaut, X.numpag, X.ordemm, X.urlk, X.especial
FROM (SELECT AAAA.codmat, AAAA.codac, AAAA.codpas, AAAA.codag, AAAA.codme, AAAA.codper, AAAA.codreg,
AAAA.codpais, AAAA.estado, AAAA.codabr, AAAA.coded, AAAA.datamateri, AAAA.chamada, AAAA.sutit, AAAA.titulo,
AAAA.texto, AAAA.ordemmat, AAAA.publica, AAAA.tammat, AAAA.coddestaq, AAAA.datah, AAAA.codimport,
AAAA.codpos, AAAA.codimport_ag, AAAA.hora, AAAA.codred, AAAA.visible, AAAA.criado, AAAA.unim, AAAA.origem,
AAAA.codaut, AAAA.numpag, AAAA.ordemm, AAAA.urlk, AAAA.especial
FROM (SELECT AAA1.codmat, AAA1.codac, AAA1.codpas, AAA1.codag, AAA1.estado, AAA1.codabr, AAA1.codme,
AAA1.codper, AAA1.codreg, AAA1.codpais, AAA1.coded, AAA1.datamateri, AAA1.chamada, AAA1.sutit,
AAA1.titulo, AAA1.texto, AAA1.ordemmat, AAA1.publica, AAA1.tammat, AAA1.coddestaq, AAA1.datah,
AAA1.codimport, AAA1.codpos, ISNULL(BBB1_1.codimport, 999) AS codimport_ag, AAA1.hora,
AAA1.codred, AAA1.visible, AAA1.criado, AAA1.unim, AAA1.origem, AAA1.codaut, AAA1.numpag, AAA1.ordemm,
FROM (SELECT AAA.codmat, BBB.codac, BBB.codpas, AAA.codag, AAA.estado, AAA.codabr,
AAA.codme, AAA.codper, AAA.codreg, AAA.codpais, AAA.coded, AAA.datamateri, AAA.chamada,
AAA.sutit, AAA.titulo, AAA.texto, AAA.ordemmat, AAA.publica, AAA.tammat,
AAA.coddestaq, AAA.datah, AAA.codimport, AAA.codpos, AAA.hora, AAA.codred, BBB.visible,
AAA.criado, AAA.unim, AAA.origem, AAA.codaut, AAA.numpag, BBB.ordemm, AAA.urlk,
AAA.especial
FROM (SELECT AA.codmat, AA.codag, BB.estado, AA.codabr, AA.codme, AA.codper,
BB.codreg, BB.codpais, AA.coded, AA.datamateri, AA.chamada, AA.sutit, AA.titulo,
AA.texto, AA.ordemmat, AA.publica, AA.tammat, AA.coddestaq, AA.datah,
AA.codimport, AA.codpos, AA.hora, AA.codred, AA.criado, AA.unim, AA.origem,
AA.codaut, AA.numpag, AA.urlk, AA.especial
FROM (SELECT A.codmat, A.codag, B.codlocal, B.codabr, B.codme, B.codper,
A.coded, A.datamateri, A.chamada, A.sutit, A.titulo, A.texto,
A.ordemmat, A.publica, A.tammat, A.coddestaq, A.datah, B.codimport,
A.codpos, A.hora, B.codred, A.criado, A.unim, A.origem, A.codaut,
A.numpag, A.urlk, B.especial
FROM (SELECT codmat, codag, coded, datamateri, chamada, sutit,
titulo, texto, ordemmat, publica, tammat, coddestaq,
datah, codpos, hora, criado, unim, origem, codaut, numpag, urlk
FROM dbo.mat WITH (NOLOCK)
WHERE (publica = 1)) AS A LEFT OUTER JOIN
(SELECT codag, codlocal, codabr, codme, codper, codimport, codred, especial
FROM dbo.agtemid WITH (NOLOCK)) AS B ON A.codag = B.codag) AS AA LEFT OUTER JOIN
(SELECT codlocal, estado, codreg, codpais
FROM dbo.local WITH (NOLOCK)) AS BB ON AA.codlocal = BB.codlocal) AS AAA LEFT OUTER JOIN
(SELECT DISTINCT BBB1.codmat, BBB1.codac, BBB1.codpas, BBB2.bd, BBB2.visible, BBB2.ordemm
FROM (SELECT codmat, codac, codpasFROM dbo.aclip WITH (NOLOCK)) AS BBB1 LEFT OUTER JOIN (SELECT codpas, bd, visible, ordemm, codac
FROM dbo.ap6 WITH (NOLOCK)) AS BBB2 ON BBB1.codpas = BBB2.codpasAND (BBB2.bd IS NULL OR BBB2.bd = 0) AND BBB1.codac = BBB2.codac) AS BBB ON
AAA.codmat = BBB.codmat) AS AAA1 LEFT OUTER JOIN
(SELECT codag, codac, codimport
FROM dbo.agtemid_import WITH (NOLOCK)) AS BBB1_1 ON AAA1.codag = BBB1_1.codag AND
AAA1.codac = BBB1_1.codac) AS AAAA LEFT OUTER JOIN
(SELECT codac, codcontrat
FROM dbo.acmats WITH (NOLOCK)) AS BBBB ON AAAA.codac = BBBB.codac) AS X LEFT OUTER JOIN
(SELECT DISTINCT codmat
FROM dbo.matvid WITH (NOLOCK)) AS Y ON X.codmat = Y.codmat) AS Z LEFT OUTER JOIN
(SELECT DISTINCT codmat
FROM dbo.matsom WITH (NOLOCK)) AS W ON Z.codmat = W.codmat) AS P LEFT OUTER JOIN
(SELECT DISTINCT codmat
FROM dbo.matimg WITH (NOLOCK)) AS Q ON P.codmat = Q.codmat
WHERE (P.codac IS NOT NULL)
GO
-
Ao meu ver, o problema é:
"P" não é uma tabela física. É derivada.
Ou seja, isso:
(SELECT Z.codmat, Z.codac, Z.codpas, Z.codag, Z.codme, Z.codper, Z.codreg, Z.codpais, Z.estado, Z.codabr, Z.coded, Z.datamateri, Z.chamada, Z.sutit, Z.titulo, Z.texto, Z.ordemmat, Z.publica, Z.tammat, Z.coddestaq, Z.datah, Z.codimport, Z.codpos, Z.video, (CASE WHEN ISNULL(W.codmat, 0) > 0 THEN 1 ELSE 0 END) AS som, Z.codimport_ag, Z.hora, Z.codred, Z.visible, Z.criado, Z.unim, Z.origem, Z.codaut, Z.numpag, Z.ordemm, Z.urlk, Z.especial FROM (SELECT X.codmat, X.codac, X.codpas, X.codag, X.codme, X.codper, X.codreg, X.codpais, X.estado, X.codabr, X.coded, X.datamateri, X.chamada, X.sutit, X.titulo, X.texto, X.ordemmat, X.publica, X.tammat, X.coddestaq, X.datah, X.codimport, X.codpos, (CASE WHEN ISNULL(Y.codmat, 0) > 0 THEN 1 ELSE 0 END) AS video, X.codimport_ag, X.hora, X.codred, X.visible, X.criado, X.unim, X.origem, X.codaut, X.numpag, X.ordemm, X.urlk, X.especial FROM (SELECT AAAA.codmat, AAAA.codac, AAAA.codpas, AAAA.codag, AAAA.codme, AAAA.codper, AAAA.codreg, AAAA.codpais, AAAA.estado, AAAA.codabr, AAAA.coded, AAAA.datamateri, AAAA.chamada, AAAA.sutit, AAAA.titulo, AAAA.texto, AAAA.ordemmat, AAAA.publica, AAAA.tammat, AAAA.coddestaq, AAAA.datah, AAAA.codimport, AAAA.codpos, AAAA.codimport_ag, AAAA.hora, AAAA.codred, AAAA.visible, AAAA.criado, AAAA.unim, AAAA.origem, AAAA.codaut, AAAA.numpag, AAAA.ordemm, AAAA.urlk, AAAA.especial FROM (SELECT AAA1.codmat, AAA1.codac, AAA1.codpas, AAA1.codag, AAA1.estado, AAA1.codabr, AAA1.codme, AAA1.codper, AAA1.codreg, AAA1.codpais, AAA1.coded, AAA1.datamateri, AAA1.chamada, AAA1.sutit, AAA1.titulo, AAA1.texto, AAA1.ordemmat, AAA1.publica, AAA1.tammat, AAA1.coddestaq, AAA1.datah, AAA1.codimport, AAA1.codpos, ISNULL(BBB1_1.codimport, 999) AS codimport_ag, AAA1.hora, AAA1.codred, AAA1.visible, AAA1.criado, AAA1.unim, AAA1.origem, AAA1.codaut, AAA1.numpag, AAA1.ordemm, FROM (SELECT AAA.codmat, BBB.codac, BBB.codpas, AAA.codag, AAA.estado, AAA.codabr, AAA.codme, AAA.codper, AAA.codreg, AAA.codpais, AAA.coded, AAA.datamateri, AAA.chamada, AAA.sutit, AAA.titulo, AAA.texto, AAA.ordemmat, AAA.publica, AAA.tammat, AAA.coddestaq, AAA.datah, AAA.codimport, AAA.codpos, AAA.hora, AAA.codred, BBB.visible, AAA.criado, AAA.unim, AAA.origem, AAA.codaut, AAA.numpag, BBB.ordemm, AAA.urlk, AAA.especial FROM (SELECT AA.codmat, AA.codag, BB.estado, AA.codabr, AA.codme, AA.codper, BB.codreg, BB.codpais, AA.coded, AA.datamateri, AA.chamada, AA.sutit, AA.titulo, AA.texto, AA.ordemmat, AA.publica, AA.tammat, AA.coddestaq, AA.datah, AA.codimport, AA.codpos, AA.hora, AA.codred, AA.criado, AA.unim, AA.origem, AA.codaut, AA.numpag, AA.urlk, AA.especial FROM (SELECT A.codmat, A.codag, B.codlocal, B.codabr, B.codme, B.codper, A.coded, A.datamateri, A.chamada, A.sutit, A.titulo, A.texto, A.ordemmat, A.publica, A.tammat, A.coddestaq, A.datah, B.codimport, A.codpos, A.hora, B.codred, A.criado, A.unim, A.origem, A.codaut, A.numpag, A.urlk, B.especial FROM (SELECT codmat, codag, coded, datamateri, chamada, sutit, titulo, texto, ordemmat, publica, tammat, coddestaq, datah, codpos, hora, criado, unim, origem, codaut, numpag, urlk FROM dbo.mat WITH (NOLOCK) WHERE (publica = 1)) AS A LEFT OUTER JOIN (SELECT codag, codlocal, codabr, codme, codper, codimport, codred, especial FROM dbo.agtemid WITH (NOLOCK)) AS B ON A.codag = B.codag) AS AA LEFT OUTER JOIN (SELECT codlocal, estado, codreg, codpais FROM dbo.local WITH (NOLOCK)) AS BB ON AA.codlocal = BB.codlocal) AS AAA LEFT OUTER JOIN (SELECT DISTINCT BBB1.codmat, BBB1.codac, BBB1.codpas, BBB2.bd, BBB2.visible, BBB2.ordemm FROM (SELECT codmat, codac, codpas FROM dbo.aclip WITH (NOLOCK)) AS BBB1 LEFT OUTER JOIN (SELECT codpas, bd, visible, ordemm, codac FROM dbo.ap6 WITH (NOLOCK)) AS BBB2 ON BBB1.codpas = BBB2.codpas AND (BBB2.bd IS NULL OR BBB2.bd = 0) AND BBB1.codac = BBB2.codac) AS BBB ON AAA.codmat = BBB.codmat) AS AAA1 LEFT OUTER JOIN (SELECT codag, codac, codimport FROM dbo.agtemid_import WITH (NOLOCK)) AS BBB1_1 ON AAA1.codag = BBB1_1.codag AND AAA1.codac = BBB1_1.codac) AS AAAA LEFT OUTER JOIN (SELECT codac, codcontrat FROM dbo.acmats WITH (NOLOCK)) AS BBBB ON AAAA.codac = BBBB.codac) AS X LEFT OUTER JOIN (SELECT DISTINCT codmat FROM dbo.matvid WITH (NOLOCK)) AS Y ON X.codmat = Y.codmat) AS Z LEFT OUTER JOIN (SELECT DISTINCT codmat FROM dbo.matsom WITH (NOLOCK)) AS W ON Z.codmat = W.codmat) AS P
.. vc chamou de tabela "P".
Quando vc faz um update ou insert na view, ele tenta atualizar "P", sendo que ela não existe.
- Sugerido como Resposta Eder Costa segunda-feira, 3 de janeiro de 2011 17:00
-
Ao meu ver, o problema é:
"P" não é uma tabela física. É derivada.
Ou seja, isso:
(SELECT ....... P
.. vc chamou de tabela "P".
Quando vc faz um update ou insert na view, ele tenta atualizar "P", sendo que ela não existe.
Peço desculpas, mais acho que quando eu colei esta view não veio esta parte de cima, justamente o "P"
(SELECT P.codmat, P.codac, P.codpas, P.codag, P.codme, P.codper, P.codreg, P.codpais, P.estado, P.codabr, P.coded,
P.datamateri, P.chamada, P.sutit, P.titulo, P.texto, P.ordemmat, P.publica, P.tammat, P.coddestaq, P.datah, P.codimport,
P.codpos, P.video, (CASE WHEN ISNULL (W.codmat, 0) > 0 THEN 1 ELSE 0 END ) AS som, P.codimport_ag, P.hora, P.codred, P.visible,
P.criado, P.unim, P.origem, P.codaut, P.numpag, P.ordemm, P.urlk, P.especial -
Vc não entendeu.
Veja meu post anterior. Tudo aquilo que eu colei, é apenas uma parte da sua view. E essa parte que eu colei, vc chama de tabela "P". Ou seja, tem um "as P" no final.
Tudo aquilo que colei no meu post anteior, vc chama de tabela "P" dentro da sua view. Entendeu? E como a tabela "P" não existe, é uma tabela derivada, ele gera o erro que vc está tendo.
Nesse caso, ao meu ver, não será possível o update em cima da view,
-
-
Oh seu insert está dando errado porque está faltando o AS.
Tente novamente e veja se obtém exito:
---
insert into view_clip
(codma, codac, codp, codag, codm, codper, codr, codpais, est, codabr, coded, datamat,
chamada, subt, titulo, texto, ordem, public, tam, coddest, datah, codimport, codpos, vid,
som, imagem, codim_ag, hora, codred, vis, criador, unim1, orig, codaut, numpag, ord, urlk)
AS
(SELECT
codma, codac, codp, codag, codm, codper, codr, codpais, est, codabr, coded, datamat,
chamada, subt, titulo, texto, ordem, public, tam, coddest, datah, codimport, codpos, vid,
som, imagem, codim_ag, hora, codred, vis, criador, unim1, orig, codaut, numpag, ord, urlk
FROM vw_clip
where
codma = '123456' AND codp = 'BRASIL' ) -
Agora veja se seu update funciona:
UPDATE vw_clip
SET vw_clip.codpas = 'EDITORIAIS'
WHERE vw_clip.codpasta in (SELECT aclip.codpasta FROM mate mat, acomp aclip, vw_clip vw
WHERE vw.[public] = 1
AND vw.codmat = aclip.codmat
AND vw.codac = aclip.codac
AND vw.coded = mat.coded
AND vw.titulo = mat.titulo
AND vw.coded = mat.coded
AND vw.codmat = '1500100'
AND aclip.codac = 'DENSO'
AND vw.codmat IN (SELECT vw.codmat FROM vw_clip vw WHERE VW.[public] = 1)
AND vw.datamat > '2010-11-20 05:00:00.000'
AND mat.codag IN ('CORREIO', 'FOLHA', 'ESTADO SP', 'GLOBO')
AND vw.coded IN ('EDITORIAL', 'OPINIÃO'));---
Qualquer dúvida continue postando!
@lucas_matos1
-
Agora veja se seu update funciona:
UPDATE vw_clip
SET vw_clip.codpas = 'EDITORIAIS'
WHERE vw_clip.codpasta in (SELECT aclip.codpasta FROM mate mat, acomp aclip, vw_clip vw
WHERE vw.[public] = 1
AND vw.codmat = aclip.codmat
AND vw.codac = aclip.codac
AND vw.coded = mat.coded
AND vw.titulo = mat.titulo
AND vw.coded = mat.coded
AND vw.codmat = '1500100'
AND aclip.codac = 'DENSO'
AND vw.codmat IN (SELECT vw.codmat FROM vw_clip vw WHERE VW.[public] = 1)
AND vw.datamat > '2010-11-20 05:00:00.000'
AND mat.codag IN ('CORREIO', 'FOLHA', 'ESTADO SP', 'GLOBO')AND vw.coded IN ('EDITORIAL', 'OPINIÃO')
GROUP BY aclip.codpasta);
---
Qualquer dúvida continue postando!
@lucas_matos1
Tentei fazer o update mais ele não permite....
Msg 4403, Level 16, State 1, Line 1
Cannot update the view or function 'vw_clip' because it contains aggregates, or a DISTINCT or GROUP BY clause, or PIVOT or UNPIVOT operator. -
Segue:
UPDATE vw_clip
SET vw_clip.codpas = 'EDITORIAIS'
FROM
VW_CLIP
INNER JOIN acomp
ON
vw_clip.codpasta = acomp.codpasta
AND
vw_clip.codmat = acomp.codmat
AND
vw_clip.codac = acomp.codac
AND
acomp.codac = 'DENSO'
AND
vw_clip.codmat = '1500100'
INNER JOIN mate
ON
vw_clip.coded = mate.coded
AND
vw_clip.titulo = mate.titulo
AND
vw_clip.coded = mate.coded
AND
vw_clip.[public] = 1
AND
vw_clip.datamat > '2010-11-20 05:00:00.000'
AND
mate.codag IN ('CORREIO', 'FOLHA', 'ESTADO SP', 'GLOBO')
AND
vw_clip.coded IN ('EDITORIAL', 'OPINIÃO')- Sugerido como Resposta Eder Costa segunda-feira, 3 de janeiro de 2011 16:59
-
Tentei o update conforme vc passou, porém dá erro tb por ser em campo PK.
Msg 2627, Level 14, State 1, Line 1
Violation of PRIMARY KEY constraint 'PK_acomp'. Cannot insert duplicate key in object 'dbo.acomp'.
The statement has been terminated.Eu acho que será meio complicado esse update por ser uma primary key.
Estive pesquisando terá que ser algo tipo um update em cascade, correto?
-
-
Bom, resolvi atualizar as tabelas mesmo e deixar a view de lado, pois na view eu particularmente não consegui fazer insert nem o update...
No sql server 2008 tem views materializadas?
- Marcado como Resposta CarlosHB quinta-feira, 3 de março de 2011 20:18
-
-
-
Boa Noite,
O SQL Server assim como outros SGBDs permite o uso de comandos DML (INS, DEL e UPD) contra views. A questão é que não é qualquer view que pode ser influenciada por esses comandos. Algumas regras precisam ser impostas para tornar isso possível:
- Apenas uma tabela por vez pode ser atualizada (se a view referencia várias tabelas é possível atualizar, mas apenas uma por vez)
- Colunas calculadas não podem ser atualizadas
- A view não pode conter operadores especiais como DISTINCT e (ou) subqueriesHá outras restrições conforme o Books OnLine (procure o comando CREATE VIEW no tópico Updatable Views) e receio que sua view contenha construções proibidas. É possível retirar todas as restrições com o uso de triggers Instead Of, mas aí... Bem algo que eu não recomendaria.
O SQL Server, o DB2 e o ORACLE possuem visões materializadas diferindo apenas no nome:
SQL Server - Indexed Views
DB2 - Materialized Query Table
Oracle - Materialized ViewHá algumas restrições na construção e atualização de views materializadas do SQL Server em relação ao Oracle, mas no conceito em sua essência, não há divergências. O objetivo é materializar os dados para que as consultas sejam mais rápidas. Todos os três o fazem.
[ ]s,
Gustavo Maia Aguiar
http://gustavomaiaaguiar.spaces.live.comCompêndio de XML – Preparação para o exame 70-433 - MCTS Microsoft SQL Server 2008 - Database Development
http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!1161.entry
Classifique as respostas. O seu feedback é imprescindível- Sugerido como Resposta Gustavo Maia Aguiar segunda-feira, 27 de dezembro de 2010 04:55
- Marcado como Resposta Eder Costa segunda-feira, 3 de janeiro de 2011 16:59
-
Soh relembrando.... o SQL Server não possui View Materializada (Oracle). O que ele tem, é a view indexada , que é "similar" às views materializada do oracle. O sql server 2008 suporta view indexada...
Rafael Melo
Bem lembrado Rafael, é que estou estudando Oracle também e acabei misturando....ahhahehe
Valeu!