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 / 113121
Accepted
Nelson
Nelson
Asked: 2015-09-04 09:00:19 +0800 CST2015-09-04 09:00:19 +0800 CST 2015-09-04 09:00:19 +0800 CST

INSERT de SELECT usando um CURSOR

  • 772

Eu tenho uma tabela que se parece com isso:

+====================================================+
| aid  |  uid  |  eid  |  name  |    dob     | paid  |
+====================================================+
|  1   |  100  |  10   |  Mick  | 1980-03-29 |  40   |
|  2   |  101  |  11   |  Jack  | 1969-11-21 |  40   |
|  3   |  205  |  11   |  Lynn  | 1990-07-10 |  80   |
|  4   |  217  |  10   |  Dana  | 1987-02-15 |  40   |
+----------------------------------------------------+

Onde aid = coluna de identidade da tabela temporária, uid = tabela do usuário FK, eid = tabela do empregador FK

Portanto, esses dados precisam ir para outra tabela, mas ficaria mais ou menos assim:

+====================================================+
|  id  |  uid  |  eid  |  week  |  postdate  | paid  |
+====================================================+
|  1   |  100  |  10   |    1   | 2015-09-03 |  10   |
|  2   |  100  |  10   |    2   | 2015-09-03 |  10   |
|  3   |  100  |  10   |    3   | 2015-09-03 |  10   |
|  4   |  100  |  10   |    4   | 2015-09-03 |  10   |
|  1   |  101  |  11   |    1   | 2015-09-03 |  10   |
|  2   |  101  |  11   |    2   | 2015-09-03 |  10   |
|  3   |  101  |  11   |    3   | 2015-09-03 |  10   |
|  4   |  101  |  11   |    4   | 2015-09-03 |  10   |
|  1   |  205  |  11   |    1   | 2015-09-03 |  20   |
|  2   |  205  |  11   |    2   | 2015-09-03 |  20   |
|  3   |  205  |  11   |    3   | 2015-09-03 |  20   |
|  4   |  205  |  11   |    4   | 2015-09-03 |  20   |
|  1   |  217  |  10   |    1   | 2015-09-03 |  10   |
|  2   |  217  |  10   |    2   | 2015-09-03 |  10   |
|  3   |  217  |  10   |    3   | 2015-09-03 |  10   |
|  4   |  217  |  10   |    4   | 2015-09-03 |  10   |
+----------------------------------------------------+

Então, o que está acontecendo é que eu escolho um mês do ano e, em seguida, obtenho os números da semana desse mês ( weekcoluna) e, para cada registro em minha tabela inicial, adiciono um à minha segunda tabela. Mick, Jack e Dana pagaram 40 (divididos em 4 [semanas do mês]) e Lynn pagou 80, chegando a 20 por semana do mês selecionado.

Então, basicamente, gostaria de perguntar se ESSE ou ESSE tipo de método usando a CURSORé o que estou procurando ou se há algo mais específico para inserir registros de a SELECTpara cada registro na tabela (não mais que 600 (x4) registros em A Hora).


De um lado, observe os exemplos apenas considerando "mover" ou replicar os registros de uma tabela para a outra, de modo que 100 registros aqui se tornem 100 registros ali. Quais opções posso implementar para inserir 4 registros por cada um na minha tabela temporária (além de loops no meu código de front-end) usando SQL?

sql-server-2005 insert
  • 1 1 respostas
  • 79 Views

1 respostas

  • Voted
  1. Best Answer
    Steve Mangiameli
    2015-09-04T10:43:25+08:002015-09-04T10:43:25+08:00

    Abaixo está um exemplo que usa um CTE recursivo para criar valores semanais e um simples INSERT...SELECT para preencher sua tabela. Presumi alguns IDs de identidade para fins de teste, além da data posterior ser a data atual. Você não precisa de um cursor para fazer este trabalho. Apreciar!

        --CREATE SCENARIO TEMP TABLE
        IF OBJECT_ID('tempdb..#TempUserPaid','U') IS NOT NULL
            DROP TABLE #TempUserPaid
    
        CREATE TABLE #TempUserPaid
        (
              aid INT IDENTITY
            , uid INT
            , eid INT
            , name VARCHAR(50)
            , dob DATE
            , paid DECIMAL(19,4)
        )
    
        INSERT #TempUserPaid
        VALUES
             (100,10,'Mick','1980-03-29',40.00)
            ,(101,11,'Jack','1969-11-21',40.00)
            ,(205,11,'Lynn','1990-07-10',80.00)
            ,(217,10,'Dana','1987-02-15',40.00)
    
    
        --CREATE WEEKLYPAYMENTS TABLE IF IT DOESN'T EXIST TO MODEL USER TABLE
        --DROP TABLE WeeklyPayments  --> CLEAR OUT FOR TESTING PURPOSES
        IF OBJECT_ID('WeeklyPayments','U') IS NULL
            CREATE TABLE WeeklyPayments
            (
                  id INT IDENTITY
                , uid INT
                , eid INT
                , [week] INT
                , postdate DATE
                , paid DECIMAL(19,4)
            );
    
        --INSERT YOUR CODE TO GENERATE NUMBER OF WEEKS HERE TO SET @weeksInMonth
        --HARDCODING FOR THIS EXAMPLE
        DECLARE @weeksInMonth SMALLINT;
        SET @weeksInMonth = 4;
    
    
        --RECURSIVE CTE TO GENERATE THE NUMBER OF WEEKS
        WITH cteWeeks AS
        (
            SELECT 1 WeekInMonth
            UNION ALL
            SELECT WeekInMonth+1 
            FROM cteWeeks
            WHERE WeekInMonth < @weeksInMonth
        )
        INSERT WeeklyPayments
        SELECT t.uid, t.eid, c.WeekInMonth, CONVERT(DATE,GETDATE()), CAST(t.paid/4 AS money)
        FROM #TempUserPaid t, cteWeeks c
        ORDER BY t.uid;
    
        SELECT * FROM WeeklyPayments;
    
    • 3

relate perguntas

  • Como posso saber POR QUE uma inserção em uma determinada tabela é lenta?

  • Como alterar a ordem de disparo dos Triggers?

  • Alguém usou o modo sqlcmd na prática? [fechado]

  • Como altero o nome da instância no MS SQL 2005 sem instalar uma nova instância?

  • 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