2016-08-21 1 views
2

J'ai une base de données appelée Customer qui a une table appelée CustDetails. Les données dans le tableau sont semblables à ci-dessous (j'en ai enlevé une partie pour la brièveté). ID est le PK.Copier des données de la table SQL Server vers la même table

CustDetails:

ID CustNo Year StatusId 
-------------------------- 
1 1231 2015 1 
2 1232 2015 2 
3 1233 2015 2 
4 1234 2014 1 
5 1235 2014 2 

J'ai une autre base de données appelée Claim sur le même serveur, qui a une table appelée ClaimDetails (ne me demandez pas pourquoi les tableaux ne sont pas dans le même DB, mais la décision de conception a été faite avant de venir à bord et n'est pas quelque chose que je peux changer.)

Les données sont similaires ci-dessous (à nouveau certaines d'entre elles enlevées par souci de concision)

ClaimDetails:

ID ClaimNumber CustNo 
---------------------- 
1 1   1231 
2 2   1232 
3 3   1236 
4 4   1237 

J'ai quelques petites choses à accomplir:

  1. Copiez toutes les lignes de CustDetails où l'année est 2015 et changer l'année 2016
  2. Si l'état du résultat de la partie 1 est 2 la définir sur 1 pour 2016
  3. Créer une liste négative pour trouver CustNo qui se trouvent dans la table ClaimDetails mais qui ne sont pas dans la CustDetails tableau - pour ces créer une nouvelle ligne dans le tableau CustDetails et définir l'état à 3 et l'année 2016.

Donc, pour les données que j'ai énuméré au-dessus du résultat final que je veux atteindre est:

CustDetails:

ID CustNo Year StatusId 
    -------------------------- 
    1 1231 2015 1 
    2 1232 2015 2 
    3 1233 2015 2 
    4 1234 2014 1 
    5 1235 2014 2 
    6 1231 2016 1 
    7 1232 2016 1 
    8 1233 2016 1 
    9 1236 2016 3 
    10 1237 2016 3 

jusqu'à présent, j'ai cette requête:

insert into CustDetails (CustNo, Year, StatusId) 
    select 
     CustNo, 2016, StatusId 
    from 
     CustDetails 
    where 
     Year = 2015 

Cela couvre une partie 1. Je n'ai pas la logique en place pour la partie 2 dans la requête ci-dessus et je suppose que je pouvais faire:

UPDATE CustDetails 
SET StatusId = 1 
WHERE Year = 2016 AND StatusId = 2 

Encore une fois, je ne l'ai pas fait la requête pour une partie 3 mais je pense que je pourrais obtenir les CustNo « s qui sont ClaimDetails mais pas dans CustDetails en faisant quelque chose comme:

SELECT CustNo 
FROM ClaimDetails 
WHERE CustNo NOT IN (SELECT CustNo FROM CustDetails) 

Et puis fais créer des ID pour chaque CustNo individuellement.

Question est-ce la meilleure façon de le faire ou devrais-je faire quelque chose comme copie à une table temporaire d'abord. Et la requête pour la 3ème partie fonctionnera bien même si ce sont deux DB séparés - je suppose que s'ils sont sur le même serveur tant que je qualifie complètement la DB cela devrait fonctionner correctement.

+0

@parfait - note J'ai dit cela dans ma question et j'ai aussi mentionné que c'est quelque chose que je n'ai pas le contrôle sur le changement –

Répondre

3

En fait, avec votre 2ème requête, vous allez également mettre à jour les anciennes données qui existaient déjà avant l'exécution de la première requête.Donc, je suggère d'utiliser CASE QUAND comme ceci:

INSERT INTO CustDetails (CustNo, Year, StatusId) 
SELECT CustNo, 2016, CASE WHEN StatusId = 2 THEN 1 ELSE StatusId END 
FROM CustDetails 
WHERE Year = 2015 

La 3ème requête peut également être effectuée à l'aide de la même INSERT INTO SELECT:

INSERT INTO CustDetails (CustNo, Year, StatusId) 
SELECT CustNo, 2016, 3 
FROM ClaimDetails 
WHERE CustNo NOT IN (SELECT CustNo FROM CustDetails) 

Vous devrez qualifier complètement la DB, y compris le nom du schéma comme DatabaseName.SchemaName.TableName pour une requête multi-base de données.