2009-09-21 4 views
0

SQL Server Синтаксис:Обновление от SQL Server для Oracle

Я превратили его в Oracle Синтаксис:

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) 

Правильно ли это? Я подозреваю, что меняю логику обновления.

ответ

3

I думаю логика такая же, хотя я не знаю SQL Server. Я могу вам сказать, что эквивалентный Oracle делает это:

1) Обновить все Relationship строки, где Eсть соответствующий SEGMENTS_LANE ряд с тем же LANE_ID

2) Установить отношения Роу (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 

NB Это ВЫБОР сусла возврата одна строка для все взаимосвязи строк, которые будут обновлены.

Вместо использования функции CONCAT вы можете использовать Oracle || оператор:

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

Переверните слова «Oracle» с помощью «SQL» (т. е. я не знаю Oracle), и я полностью согласен. За исключением || оператора, конечно. –

Смежные вопросы