2009-09-21 10 views
0

Syntaxe SQL Server:déclaration de mise à jour de SQL Server à Oracle

Je converti à Oracle Syntaxe:

UPDATE RELATIONSHIP 
SET (SEGMENT_START_DT,SEGMENT_END_DT,SEGMENT_ID) = 
(SELECT SEGMENTS_LANE.SEGMENT_START_DT, SEGMENTS_LANE.SEGMENT_END_DT, 
CONCAT(CONCAT(CONCAT(CONCAT('XCSLANE','-'),SEGMENTS_LANE.LANE_ID),'- 
'),TO_CHAR(SEGMENTS_LANE.SEGMENT_START_DT,'dd mon yyyy hh24:mm:ss')) 
FROM SEGMENTS_LANE 
WHERE RELATIONSHIP.LANE_ID = SEGMENTS_LANE.LANE_ID 
AND RELATIONSHIP.TO_WE_DT > SEGMENTS_LANE.SEGMENT_START_DT 
AND RELATIONSHIP.TO_WE_DT <= SEGMENTS_LANE.SEGMENT_END_DT 
AND SEGMENTS_LANE.SEGMENT_START_DT IS NOT NULL) 
WHERE RELATIONSHIP.lane_id IN (SELECT SEGMENTS_LANE.LANE_ID FROM SEGMENTS_LANE) 

Est-ce exact? Je suspecte que je change la logique de la mise à jour.

Répondre

3

I pense la logique est la même, même si je ne connais pas SQL Server. Je peux vous dire que l'équivalent Oracle fait ceci:

1) Mettre à jour toutes les lignes de relation où il y a une ligne de SEGMENTS_LANE correspondante avec le même LANE_ID

2) Réglez le SEGMENT_END_DT, (de ligne de RELATION SEGMENT_START_DT, ID_segment) à la valeur renvoyée par:

SELECT SEGMENTS_LANE.SEGMENT_START_DT, SEGMENTS_LANE.SEGMENT_END_DT, 
CONCAT(CONCAT(CONCAT(CONCAT('XCSLANE','-'),SEGMENTS_LANE.LANE_ID),'- 
'),TO_CHAR(SEGMENTS_LANE.SEGMENT_START_DT,'dd mon yyyy hh24:mm:ss')) 

FROM SEGMENTS_LANE 
WHERE RELATIONSHIP.LANE_ID = SEGMENTS_LANE.LANE_ID 
AND RELATIONSHIP.TO_WE_DT > SEGMENTS_LANE.SEGMENT_START_DT 
AND RELATIONSHIP.TO_WE_DT <= SEGMENTS_LANE.SEGMENT_END_DT 
AND SEGMENTS_LANE.SEGMENT_START_DT IS NOT NULL 

NB Cette SELECT doit retour une ligne pour toutes les lignes de RELATION à être mis à jour. Au lieu d'utiliser la fonction CONCAT, vous pouvez utiliser Oracle || opérateur:

'XCSLANE' || '-' || SEGMENTS_LANE.LANE_ID || '-' 
|| TO_CHAR(SEGMENTS_LANE.SEGMENT_START_DT,'dd mon yyyy hh24:mm:ss') 
+0

Inversez les mots "Oracle" avec "SQL" (c'est-à-dire que je ne connais pas Oracle), et je suis entièrement d'accord. Sauf pour le || opérateur, bien sûr. –

Questions connexes