Peut DB2 AVEC la déclaration dans le cadre d'une mise à JOUR ou de FUSION?
J'ai besoin de mettre à jour des lignes dans une table DB. Comment je identifier les lignes à mettre à jour une série de compliqué états, et j'ai réussi à les faire bouillir jusqu'à une série de déclarations. Maintenant, j'ai le bon de valeurs de données, j'ai besoin de mettre à jour la table.
Depuis que j'ai réussi à obtenir ces valeurs avec une instruction with, j'espérais pouvoir l'utiliser dans la mise à JOUR/FUSION. Un exemple simplifié suivant:
with data1
(
ID_1
)
as
(
Select ID
from ID_TABLE
where ID > 10
)
,
cmedb.data2
(
MIN_ORIGINAL_ID
,OTHER_ID
)
as
(
Select min(ORIGINAL_ID)
,OTHER_ID
from OTHER_ID_TABLE
where OTHER_ID in
(
Select distinct ID_1
From data1
)
group by OTHER_ID
)
select MIN_ORIGINAL_ID
,OTHER_ID
from cmedb.data2
Maintenant, j'ai les deux colonnes de données, je veux les utiliser pour mettre à jour une table. Donc au lieu de devoir les sélectionner en bas, j'ai essayé toutes sortes de combinaisons de fusions et mises à jour, y compris l'instruction au-dessus de la mise à JOUR/de FUSION, ou dans le cadre de la mise à JOUR/MERGE. Voici ce qui s'en rapproche le plus dans mon esprit, ce que je veux faire:
merge into ID_TABLE as it
using
(
select MIN_ORIGINAL_ID
,OTHER_ID
from cmedb.data2
) AS SEL
ON
(
it.ID = sel.OTHER_ID
)
when matched then
update
set it.ORIGINAL_ID = sel.MIN_ORIGINAL_ID
De sorte qu'il ne fonctionne pas. Je ne suis pas sûr si cela est encore possible, comme je l'ai pas trouvé des exemples sur internet à l'aide de déclarations en combinaison avec la mise à JOUR ou de FUSION. J'ai des exemples de déclarations d'être utilisé en conjonction avec d'INSERTION, de sorte crois qu'il pourrait être possible.
Si quelqu'un peut aider ce serait génial, et s'il vous plaît laissez-moi savoir si j'ai laissé de côté toute information qui pourrait être utile pour résoudre le problème.
Avertissement: L'exemple que j'ai fourni est une bouillie version de ce que je suis en train de faire, et ne peut pas réellement aucun sens!
Vous devez vous connecter pour publier un commentaire.
Comme @Andrew White a dit, vous ne pouvez pas utiliser une expression de table commune dans une instruction MERGE.
Cependant, vous pouvez éliminer les expressions de table communes avec imbriqués les sous-sélections. Ici est votre exemple de l'instruction select, réécrite en utilisant imbriqués les sous-sélections:
C'est un peu alambiqué (l'énoncé exact pourrait être mieux écrit), mais je me rends compte que vous venez de vous donner un exemple simplifié.
Vous pouvez être en mesure de réécrire votre instruction de FUSION et publipostage à l'aide de imbriqués les sous-sélections au lieu d'expressions de table communes. C'est certainement un point de vue syntaxique possible.
Par exemple:
Encore une fois, c'est compliqué, mais il vous montre qu'il est au moins possible.
Je suis à la recherche de la grammaire maintenant, mais je suis assez sûr que la réponse est non. Au moins pas dans la version de DB2 dernière fois que j'ai utilisé. Jetez un coup d'œil à la mise à jour et fusion doc pages pour leur syntaxe. Même si vous voyez le fullselect dans la syntaxe que vous ne pouvez pas utiliser
with
comme c'est explicitement les séparer en fonction de la sélectionnez page de doc.Si vous utilisez DB2 V8 ou tard, il y a une intéressante SQL hack ici qui vous permet de mettre à JOUR/à INSÉRER dans une requête avec une instruction. Pour les inserts & mises à jour qui nécessitent beaucoup de données préliminaires, la préparation, je trouve cette méthode offre beaucoup de clarté.
Modifier Une correction ici - la sélection de la mise à JOUR des déclarations a été introduit en V9, je crois, de sorte que le ci-dessus va travailler pour inserts V8 ou plus, et les mises à jour pour la V9 ou plus.
Mettre les expressions de table communes en vue, et sélectionnez à partir de la vue dans la fusion. Vous obtenez un propre, lisible à la vue de cette façon, et d'un chiffon propre, lisible de fusion.
Un moyen d'utiliser AVEC déclaration avec mise à JOUR (et INSÉRER trop) est à l'aide de SÉLECTIONNEZ à PARTIR de la mise à JOUR déclaration (ici):
Une autre méthode consiste simplement à remplacer vos requêtes et il suffit d'utiliser les sous-sélections.
Par exemple, si vous avez eu (et j'ai essayé de comprendre un peu complexe exemple avec un OÙ la logique, une fonction d'agrégation (MAX) et un GROUPE PAR, juste pour montrer à elle de plus en plus du monde réel):
... on pourrait en faire quelque chose d'approprié pour une FUSION, EN procédant de la manière suivante:
À la fin, vous aurez un droit de requête SELECT qui ressemble à ceci (reformaté pour montrer la bonne indentation):
J'ai fait ça dans mon expérience personnelle (juste maintenant en fait) et il fonctionne parfaitement.
Bonne chance.