AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 127708
Accepted
Tim Schmelter
Tim Schmelter
Asked: 2016-01-30 03:22:46 +0800 CST2016-01-30 03:22:46 +0800 CST 2016-01-30 03:22:46 +0800 CST

Atualizando uma exibição em várias tabelas unidas

  • 772

Como o MSDN não diz muito, o que acontece exatamente se eu executar a seguinte consulta?

update claims set status='Awaiting Auth.'
where status = 'Approved' 

Posso usar a ClaimStatusNamecoluna da tabela vinculada dimClaimStatuspara atualizar a tabela principal referenciada por chave estrangeira?

A visualização em si consulta várias tabelas, a tabela principal é tabData, que também desejo atualizar com a consulta acima. Eu quero mudar fiClaimStatusdo tabDataFK que significa Approved na tabela referenciada dimClaimStatuspara Awaiting Auth.. Funciona assim?

Apenas uma linha de exibição é possível para cada linha em tabData.

Aqui está a vista:

CREATE VIEW [dbo].[Claims] 
AS 
  SELECT mu.MarketUnitName AS MarketUnit, 
         c.CountryName     AS Country, 
         gsp.GSPName       AS GSP, 
         gsp.WCMSKeyNumber AS GspNumber, 
         sl.SLName         AS SL, 
         sl.WCMSKeyNumber  AS SlNumber, 
         m.ModelName       AS Model, 
         m.SalesName       AS [Model-Salesname], 
         s.ClaimStatusName AS [Status], 
         d.Work_Order      AS [Work Order], 
         d.SSN_Number      AS IMEI, 
         .... more columns ....
         idData,         -- PK of main table tabData
         fiSL, 
         fiModel, 
         fiClaimStatus  -- FK to dimClaimStatus
  FROM   tabData AS d 
         INNER JOIN locSL AS sl 
                 ON d.fiSL = sl.idSL 
         INNER JOIN locGSP AS gsp 
                 ON sl.fiGSP = gsp.idGSP 
         INNER JOIN locCountry AS c 
                 ON gsp.fiCountry = c.idCountry 
         INNER JOIN locMarketUnit AS mu 
                 ON c.fiMarketUnit = mu.idMarketUnit 
         INNER JOIN modModel AS m 
                 ON d.fiModel = m.idModel 
         INNER JOIN dimClaimStatus AS s 
                 ON d.fiClaimStatus = s.idClaimStatus 
         INNER JOIN tdefProductType 
                 ON d.fiProductType = tdefProductType.idProductType 
         LEFT OUTER JOIN tdefServiceLevel 
                      ON d.fimaxServiceLevel = tdefServiceLevel.idServiceLevel 
         LEFT OUTER JOIN tdefActionCode AS ac 
                      ON d.fimaxActionCode = ac.idActionCode 

Atualizar

Como a tabela contém 20 milhões de registros de clientes, queria saber primeiro o que vai acontecer antes de executá-la. Após os comentários e respostas, eu o executei agora. O resultado imediato foi:

(1 row(s) affected)

O que é surpreendente, porque havia vários milhares de registros neste status que parecem estar atualizados agora.

Atualização 2

Na verdade não funcionou como esperado e o suspeito (1 row(s) affected)estava certo. Apenas a tabela referenciada foi atualizada. Então agora o status Approvedmudou para Awaiting Auth..

Conclusão:

Parece ser a melhor maneira de evitar o uso de uma exibição para fazer atualizações. Isso funciona no meu caso:

UPDATE tabData 
SET fiClaimStatus = (SELECT idClaimStatus
                     FROM dimClaimStatus
                     WHERE ClaimStatusName = 'Awaiting auth.')
WHERE fiClaimStatus=(SELECT idClaimStatus
                     FROM dimClaimStatus
                     WHERE ClaimStatusName = 'Approved')
sql-server sql-server-2005
  • 3 3 respostas
  • 12989 Views

3 respostas

  • Voted
  1. Best Answer
    Paul White
    2016-01-30T04:03:34+08:002016-01-30T04:03:34+08:00

    Capacidade de atualização da visão geral

    A parte chave da CREATE VIEW (Transact-SQL)documentação é:

    Geralmente, o Mecanismo de Banco de Dados deve ser capaz de rastrear modificações de forma inequívoca da definição de exibição para uma tabela base.

    Observe que mesmo que a visão seja tecnicamente atualizável, ela pode não ser realmente atualizável na prática, devido a limitações de raciocínio do processador de consultas. Essa é a sutileza por trás da frase "...o Mecanismo de Banco de Dados deve ser capaz de..."

    A maneira mais fácil de garantir que uma exibição seja realmente atualizável é solicitar um plano de pré-execução ("estimado") para a consulta de atualização. Se você receber um erro, a exibição não é logicamente atualizável ou o processador de consulta não pode dizer que é.

    Solicitar um plano "estimado" não envolve a execução da consulta, naturalmente. O plano mostrado também mostrará quanto da definição de exibição o otimizador de consulta foi capaz de remover (porque é redundante). Normalmente, ele faz um bom trabalho com isso, portanto, o plano de exibição de atualização pode parecer muito semelhante a um plano para uma atualização simples na única tabela base afetada.

    Exemplo específico

    Posso usar a coluna ClaimStatusName da tabela vinculada dimClaimStatus para atualizar a tabela principal referenciada por chave estrangeira? [...] quero alterar o fiClaimStatus no tabData.

    Não usando a consulta que você postou:

    update claims 
    set status='Awaiting Auth.'
    where status = 'Approved' 
    

    Isso altera a coluna da tabela base associada ao status do nome da coluna exposta da exibição . Na definição da exibição, esse é o alias da coluna ClaimStatusName na tabela dimClaimStatus .

    O plano de execução mostra que dimClaimStatus é a tabela atualizada através da view:

    Plano de execução

    Se você deseja atualizar fiClaimStatus, essa é a coluna que você precisa especificar na instrução de atualização. Se isso envolver uma pesquisa, é provável que você não possa usar a exibição diretamente, como queria originalmente, mas poderia escrever algo como:

    update claims 
    set fiClaimStatus =
    (
        select CS.idClaimStatus
        from dbo.dimClaimStatus AS CS
        where CS.ClaimStatusName = 'Awaiting auth.'
    )
    where status = 'Approved';`
    
    • 9
  2. Rob Farley
    2016-01-30T03:50:21+08:002016-01-30T03:50:21+08:00

    Imagine que seu UPDATE está atualizando scom a cláusula FROM da sua view. Então leia este blog que escrevi recentemente para ver como isso pode ser afetado.

    http://blogs.lobsterpot.com.au/2016/01/12/join-effects-with-update/

    Supondo que você não esteja quebrando as regras para exibições atualizáveis ​​, você deve estar bem. Apenas tenha cuidado com as coisas no meu post.

    • 3
  3. Bogdan Bogdanov
    2016-01-30T05:14:02+08:002016-01-30T05:14:02+08:00

    Você atualiza a coluna statedentro do arquivo view. Ele faz referência s.ClaimStatusName AS [Status]dentro da exibição. A partir do código do viewvemos que você atualiza a dimClaimStatustabela ( dimClaimStatus AS s).

    Vendo que você tem 2 colunas idClaimStatuse ClaimStatusNametem a estrutura ID\Name da tabela. Dentro da exibição que você mostra ClaimStatusName.

    Então você atualiza o nome dentro da dimClaimStatustabela. Esta é a razão de (1 row(s) affected).

    Quando você atualiza a exibição, vê uma nova string dentro de várias linhas dentro da exibição.

    • 3

relate perguntas

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

  • Downgrade do SQL Server 2008 para 2005

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve