2017-09-28 1 views
-1

J'ai le SQL ci-dessous qui essaie d'insérer dans la table financial_history_details en utilisant des sous requêtes car j'ai besoin de l'instruction pour extraire des données d'autres parties de la table.Sous-requête retournant plusieurs résultats dans un insert

Ceci est correct s'il y a une ligne d'information. Mon problème est que j'essaie d'insérer des milliers de lignes de données, avec certains bits d'information (batch_number, contact_number) tirés de différentes tables. J'ai pensé à utiliser une sous-requête comme vu dans cette déclaration, mais comme je l'ai déjà dit, cela ne fonctionne pas très bien, car elle n'insère qu'une seule donnée à la fois.

INSERT INTO financial_history (batch_number, transaction_number, contact_number, transaction_date, 
      transaction_type, amount, payment_method, posted, address_number, currency_amount) 
VALUES ((select batch_number from event_bookings where batch_number not in (select batch_number from batches)), 1, 
(select contact_number from event_bookings where batch_number not in (select batch_number from batches)), 
'20-sep-2017', 'P', 0, 'CASH', '20-sep-2017', 
(select address_number from event_bookings where batch_number not in (select batch_number from batches)), 0) ; 

J'ai également essayé d'utiliser l'importation de CSV mais est à l'origine d'un certain nombre de problèmes qui en font une solution peu pratique:

BULK 
INSERT batches 
FROM 'C:\batches.csv' 
WITH 
(
FIELDTERMINATOR = ',', 
ROWTERMINATOR = '\n' 
) 
GO 

Existe-t-il d'autres façons de le faire?

Répondre

1

Vous semblez vouloir un insert . . . select:

insert into financial_history (batch_number, transaction_number, contact_number, transaction_date, 
      transaction_type, amount, payment_method, posted, address_number, currency_amount) 
    select . . . 
    from event_bookings 
    where batch_number not in (select batch_number from batches); 

On ne sait pas ce que les valeurs que vous voulez pour les colonnes, cependant.

0

Vous pouvez utiliser, en utilisant un seul SELECT et éviter de répéter plusieurs accès à la même table (vous pouvez aussi utiliser SELECT sans insert pour vérifier la sortie)

INSERT INTO financial_history (batch_number, transaction_number, contact_number, transaction_date, 
      transaction_type, amount, payment_method, posted, address_number, currency_amount) 
SELECT batch_number, 1, contact_number, '20-sep-2017', 'P', 0, 'CASH', '20-sep-2017', address_number from event_bookings 
WHERE batch_number not in (select batch_number from batches); 

Conseils:

  • utiliser convert pour les dates et ne repose pas sur la conversion implicite (en supposant que vos colonnes de destination sont datetime type: par exemple CONVERT (datetime, '20/09/2017 ', 103) 106))

Une forme plus lisible de la même requête:

INSERT INTO financial_history (batch_number, transaction_number, contact_number, transaction_date, 
      transaction_type, amount, payment_method, posted, address_number, currency_amount) 
SELECT batch_number 
    , 1 AS TRANSACTION_NUMBER 
    , contact_number 
    , '20-sep-2017' AS TRANSACTION_DATE 
    , 'P' AS TRANSACTION TYPE 
    , 0 AS AMOUNT 
    , 'CASH' AS PAYMENT_METHOD 
    , '20-sep-2017' AS POSTED 
    , address_number 
    FROM event_bookings 
    WHERE batch_number not in (select batch_number from batches);