2010-11-15 4 views
2

J'ai une table d'état et une autre table contenant des données supplémentaires. Mes identifiants d'objets sont les PK dans la table d'état, je dois donc les insérer dans la table de données supplémentaire pour chaque nouvelle ligne.Insérer les ID de sortie dans une autre table

J'ai besoin d'insérer une nouvelle ligne dans mon statusTable pour chaque nouvelle liste, contenant juste des constantes.

declare @temp TABLE(listingID int) 

insert into statusTable(status, date) 
    output Inserted.listingID into @temp 
select 1, getdate() 
from anotherImportedTable 

Cela me donne assez de nouveaux identifiants de liste à utiliser.

J'ai besoin maintenant d'insérer les données de la liste réelle dans une autre table, et la carte chaque ligne à un de ces listingIDs -

insert into listingExtraData(listingID, data) 
select t.listingID, a.data 
from @temp t, anotherImportedTable a 

Maintenant, ce évidemment ne fonctionne pas, parce que otherDataTable et les ID dans @temp ne sont pas liés ... donc je reçois beaucoup trop de lignes insérées.

Comment puis-je insérer chaque ligne de anotherImportedTable dans listingExtraData avec un listingID nouvellement créé unique? pourrais-je éventuellement déclencher un peu plus de sql au point que je fais le output dans le premier bloc de sql?

modifier: Merci pour l'entrée jusqu'à présent, voici ce que les tables ressemblent:

anotherImportedTable:

data 

statusTable:

listingID (pk), status, date 

listingExtraDa ta:

data, listingID 

Vous voyez que je veux seulement créer une entrée en statusTable par ligne dans anotherImportedTable, puis mettre un listingID avec une ligne de anotherImportedTable dans listingExtraData ... Je pense que je pourrais avoir à recourir à un curseur peut-être?

+0

Dans la deuxième table, qu'est-ce qui indique à quel enregistrement vous voulez qu'il se rapporte? Veuillez être plus précis sur la structure et l'utilisation de la deuxième table. Incidemment, n'utilisez jamais de jointures implicites. Ce que vous avez est une jointure croisée qui relie chaque enregistrement de la première table à un enregistrement très précis de la table sencond. Même si vous le souhaitiez, il est préférable d'utiliser une syntaxe explicite pour que les personnes qui vous conservent sachent ce que vous vouliez et que la jointure croisée ne soit pas un accident. – HLGEM

+0

@HLGEM Je suis complètement d'accord, c'est un peu un bordel, d'où je me retrouve ici :) merci pour votre contribution - plus de détails fournis. – RYFN

Répondre

2

Ok, voici comment vous pouvez le faire (si je ne me trompe pas sur ce que vous voulez vraiment faire):

insert into listingExtraData(listingID, data) 
select q1.listingID, q2.data 
from 
    (select ListingID, ROW_NUMBER() OVER (order by ListingID) as rn from @temp t) as q1 
    inner join (select data, ROW_NUMBER() over (order by data) as rn from anotherImportedTable) q2 on q1.rn = q2.rn 

Si vous logique correspondant vous diffère devrez changer le tri des anotherImportedTable. Dans le cas où votre commande de correspondance ne peut pas être obtenue en commandant une autreImportable [d'une manière ou d'une autre], vous n'avez pas de chance.

+0

Ah utilisation intéressante de ROW_NUMBER() OVER, merci pour cela, je vais voir comment ça se passe. – RYFN

+0

aha, cela fait exactement ce que j'étais après, merci beaucoup :) – RYFN

Questions connexes