sql - 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:
但是所有标识符都在上面的部分中起作用。这可能是因为范围问题吗?任何帮助将不胜感激。我希望匹配和不匹配都做一些事情。他们将其标记为重复项,以便在匹配项中必须执行任何操作,但这对我完全没有帮助
解决方案
将TOUR
表连接到子句中的GUEST_TOUR
表USING
(假设每一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
推荐阅读
- intellij-idea - 有没有办法在intellij 15中断点整个项目
- java - MPAndroidChart 自定义水平条形图
- android - 将适配器与不同的布局管理器合并
- python - 有没有办法将屏幕上的所有文本放入 python3 中的数组中
- java - 在共享对象文件中查找 Android Java 可用方法
- c# - Unity 想要从另一个数组中获取游戏对象
- c - 为什么 Helgrind 显示“违反锁定顺序”错误消息?
- java - 不接受文件中的更改
- c# - 检查逗号分隔字符串中的 id 是否与另一个字符串数组中的任何 id 匹配
- flutter - Flutter - 单个项目中 Web 和 Android 的不同点击操作