【问题标题】:SQL Merge statement will not accept some of my identifiersSQL Merge 语句将不接受我的某些标识符
【发布时间】:2019-10-08 19:02:56
【问题描述】:

您好,我创建了以下 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:

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

【问题讨论】:

    标签: sql oracle sql-merge


    【解决方案1】:

    这会有帮助吗?

    UPDATE SET 
    ts.TOTALREVENUE = (select ts.TOTALREVENUE + r.COST_PER_DAY * 0.1
                       FROM TOUR r
                       WHERE r.TOUR_ID = t.TOUR_ID
                      )
    

    我在评论中提到的功能选项:

    create or replace function f_cpd (par_tour_id in tour.tour_id%type)
      return tour.cost_per_day%type
    as
      retval tour.cost_per_day%type;
    begin
      select cost_per_day * 0.1
        into retval
        from tour
        where tour_id = par_tour_id;
    
      return retval;
    end;
    
    values
    ( (SELECT TIMEID FROM FTIMEPERIOD WHERE CALENDARDATE = t.START_DATETIME),
       1, 
       t.TOUR_ID,
       f_cpd(t.tour_id),            --> use it here
       t.group_size
    );
    

    【讨论】:

    • 更新集工作正常,它是 INSERT 这给了我相信的问题
    • 啊,对不起;不知何故,我患有部分失明,没有看到写的东西。一定是导致问题的 COST_PER_DAY 选择语句;我同意你的看法,TOUR_ID 似乎太深了。尝试将这些 SELECT 语句重写为函数并通过将 T.TOUR_ID 作为参数传递来调用它们。是的,我知道 - 上下文切换和其他东西,但是......看看它是否有帮助。我编辑了我的信息,添加了一个示例来说明我的意思。
    • 但是成本部分很好,如果我只是在插入之前运行它没有问题,但如果我运行插入,那么就会有问题。
    • 对;应该使用我发布的代码而不是 INSERT 部分。
    【解决方案2】:

    TOUR 表加入USING 子句中的GUEST_TOUR 表(假设每个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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多