首页 > 解决方案 > SQL Merge 语句将不接受我的某些标识符

问题描述

您好我创建了以下 SQL 语句来帮助我将数据从一个表合并到另一个表中。以下代码似乎工作正常。

MERGE INTO FTOURSTATS ts
USING (SELECT * FROM guest_tour) t
ON (t.TOUR_ID = ts.TOURID AND t.START_DATETIME = (SELECT CALENDARDATE FROM FTIMEPERIOD tp WHERE ts.TIMEID = tp.TIMEID) AND ((SELECT SYSDATE FROM DUAL) - t.START_DATETIME ) < 7)
WHEN MATCHED THEN 
UPDATE SET 
ts.TOTALREVENUE = ts.TOTALREVENUE + ((SELECT COST_PER_DAY FROM TOUR WHERE TOUR_ID = t.TOUR_ID) * 0.1),
ts.TOTALTOURISTS = ts.TOTALTOURISTS + t.GROUP_SIZE

但是,当我输入以下代码时

WHEN NOT MATCHED THEN 
INSERT VALUES( (SELECT TIMEID FROM FTIMEPERIOD WHERE CALENDARDATE = t.TOUR_ID),1, t.TOUR_ID,(SELECT COST_PER_DAY FROM TOUR WHERE TOUR_ID = t.TOUR_ID) * 0.1,t.group_size);

二得到以下错误

Error at Command Line : 10 Column : 69
Error report -
SQL Error: ORA-00904: "T"."TOUR_ID": invalid identifier
00904. 00000 -  "%s: invalid identifier"
*Cause:    
*Action:

但是所有标识符都在上面的部分中起作用。这可能是因为范围问题吗?任何帮助将不胜感激。我希望匹配和不匹配都做一些事情。他们将其标记为重复项,以便在匹配项中必须执行任何操作,但这对我完全没有帮助

标签: sqloraclesql-merge

解决方案


TOUR表连接到子句中的GUEST_TOURUSING(假设每一GUEST_TOUR行与单行相关TOUR),然后您可以在UPDATE子句中使用它:

MERGE INTO FTOURSTATS ts
USING (
  SELECT gt.*,
         t.cost_per_day
  FROM   guest_tour gt
         LEFT OUTER JOIN tour t
         ON gt.tour_id = t.tour_id
) src
ON (   src.TOUR_ID = ts.TOURID
   AND EXISTS( SELECT 1
               FROM   FTIMEPERIOD tp
               WHERE  tp.CALENDARDATE = src.START_DATETIME
               AND    tp.TIMEID       = ts.TIMEID )
  AND SYSDATE - src.START_DATETIME < 7
)
WHEN MATCHED THEN 
UPDATE SET 
  TOTALREVENUE  = ts.TOTALREVENUE  + src.cost_per_day * 0.1,
  TOTALTOURISTS = ts.TOTALTOURISTS + src.GROUP_SIZE

推荐阅读