sql那里错啦。查不出数据

时间:2021-05-31 08:43:46
求大神指点,sql那里错啦。查不出数据,谢谢
MERGE INTO TMP3B90C8C7F05911E79701005056F T1
 USING(SELECT T3.FDATAVALUE AS FDATAVALUE ,T2.FENTRYID AS FENTRYID FROM T_SAL_ORDERENTRY T2
   LEFT JOIN T_BAS_ASSISTANTDATAENTRY_L T3 ON T2.F_PAEZ_ASSISTANT=T3.FENTRYID) T4
   ON (T1.FORDERID=T4.FENTRYID)
   WHEN MATCHED THEN
   UPDATE SET T1.FLYC_Text=T4.FDATAVALUE
   WHEN NOT MATCHED THEN 
   INSERT (T1.FLYC_Text) VALUES (NULL);

15 个解决方案

#1


一个DML语句,要显示什么数据?

#2


引用 1 楼 minsic78 的回复:
一个DML语句,要显示什么数据?


就是把t4查询出来的某个字段值更新到t1中的某个字段,符合条件的就更新,不符合条件的更新为空值

#3


报什么错?贴下

#4


你这个正好就是 不加 exists 的 update 全表

#5


引用 3 楼 baidu_36457652 的回复:
报什么错?贴下


以下为报错信息,各位大神麻烦指点,谢谢

“Kingdee.BOS.SQL.Exception.ParserException”类型的异常在 Kingdee.BOS.SQL.dll 中发生,但未在用户代码中进行处理

其他信息: parse error. detail message is :



 Error: expect token <Punctuation,)>, but current token is <Punctuation,.>, at line 9, column 13)

source sql is : 

MERGE INTO TMP10356E36F08111E7AC14B88198B A 

  USING (SELECT t1.FENTRYID as FENTRYID,t2.FDATAVALUE as FDATAVALUE

  FROM T_SAL_ORDERENTRY t1

  left join T_BAS_ASSISTANTDATAENTRY_L t2 on t2.FENTRYID=t1.F_PAEZ_ASSISTANT)B 

  ON (B.FENTRYID=A.FORDERID) 

  WHEN MATCHED THEN 

  UPDATE SET A.FLYC_Text=B.FDATAVALUE

  WHEN NOT MATCHED THEN 

  INSERT (T1.FLYC_Text) VALUES ('');

#6


你应该把这个语句连上数据库执行一下看报什么错误。
从你的报错上看来,这并不是数据库上的错误。

#7


你把这句话放到plsql中执行,看看可以不

#8


引用 7 楼 jdsnhan 的回复:
你把这句话放到plsql中执行,看看可以不


执行报错
消息 10739,级别 15,状态 1,第 17 行
MERGE 语句中使用的插入列列表中不能包含多部分标识符。请改用单部分标识符。

#9


引用 6 楼 xzh19870715 的回复:
你应该把这个语句连上数据库执行一下看报什么错误。
从你的报错上看来,这并不是数据库上的错误。


去掉这2句后可以执行啦,但是我需要在不符合ON后面的条件是,将T1.FLYC_Text的值设置为默认的值,此时以下语句报错,请教如何改,谢谢
WHEN NOT MATCHED THEN 

  INSERT (T1.FLYC_Text) VALUES ('');

#10


到底没有匹配到的时候是“更新为空值”?还是“设置为默认的值”???

如果像你语句里写的那样,想插入一个空值,这是没有意义的事情,插入一个空行算什么意思? 如果设置为默认值(当前前提是你设置了该字段的默认值),那么就直接:

  INSERT (FLYC_Text) VALUES (DEFAULT);

#11


引用 10 楼 minsic78 的回复:
到底没有匹配到的时候是“更新为空值”?还是“设置为默认的值”???

如果像你语句里写的那样,想插入一个空值,这是没有意义的事情,插入一个空行算什么意思? 如果设置为默认值(当前前提是你设置了该字段的默认值),那么就直接:

  INSERT (FLYC_Text) VALUES (DEFAULT);


想设置为没有匹配的设置为默认值
即为:INSERT (FLYC_Text) VALUES (正常);  这样写也会报错  

消息 10739,级别 15,状态 1,第 17 行
MERGE 语句中使用的插入列列表中不能包含多部分标识符。请改用单部分标识符。

#12


引用 11 楼 qq_21081883 的回复:
Quote: 引用 10 楼 minsic78 的回复:

到底没有匹配到的时候是“更新为空值”?还是“设置为默认的值”???

如果像你语句里写的那样,想插入一个空值,这是没有意义的事情,插入一个空行算什么意思? 如果设置为默认值(当前前提是你设置了该字段的默认值),那么就直接:

  INSERT (FLYC_Text) VALUES (DEFAULT);


想设置为没有匹配的设置为默认值
即为:INSERT (FLYC_Text) VALUES (正常);  这样写也会报错  

消息 10739,级别 15,状态 1,第 17 行
MERGE 语句中使用的插入列列表中不能包含多部分标识符。请改用单部分标识符。


INSERT (FLYC_Text) VALUES ('正常'); 

字符串要用单引号引起来

#13


试过啦,没有用,还是一样的,谢谢

#14


教你一个方法,把select简化一下,先验证merge into ... when的结构是否正确使用,

#15


Merge都没搞清楚,Insert部分你想插入什么数据?NULL。。。每一个不匹配就插入一个NULL,为了最后数有多少个?
T1没有主键且都允许为空的话可能不会报错,但是不会有这样的写法,把T4中不匹配的KEY值插入到T1中会更有意义,
Update部分和Insert部分都应该用到T4的,否则你这Merge的合理性就很值得怀疑。

你先撇开Merge分步把逻辑设计出来,再考虑是否适用于Merge吧,
隐约的感觉着你是想分两种case执行Update,没有Insert的需求

#1


一个DML语句,要显示什么数据?

#2


引用 1 楼 minsic78 的回复:
一个DML语句,要显示什么数据?


就是把t4查询出来的某个字段值更新到t1中的某个字段,符合条件的就更新,不符合条件的更新为空值

#3


报什么错?贴下

#4


你这个正好就是 不加 exists 的 update 全表

#5


引用 3 楼 baidu_36457652 的回复:
报什么错?贴下


以下为报错信息,各位大神麻烦指点,谢谢

“Kingdee.BOS.SQL.Exception.ParserException”类型的异常在 Kingdee.BOS.SQL.dll 中发生,但未在用户代码中进行处理

其他信息: parse error. detail message is :



 Error: expect token <Punctuation,)>, but current token is <Punctuation,.>, at line 9, column 13)

source sql is : 

MERGE INTO TMP10356E36F08111E7AC14B88198B A 

  USING (SELECT t1.FENTRYID as FENTRYID,t2.FDATAVALUE as FDATAVALUE

  FROM T_SAL_ORDERENTRY t1

  left join T_BAS_ASSISTANTDATAENTRY_L t2 on t2.FENTRYID=t1.F_PAEZ_ASSISTANT)B 

  ON (B.FENTRYID=A.FORDERID) 

  WHEN MATCHED THEN 

  UPDATE SET A.FLYC_Text=B.FDATAVALUE

  WHEN NOT MATCHED THEN 

  INSERT (T1.FLYC_Text) VALUES ('');

#6


你应该把这个语句连上数据库执行一下看报什么错误。
从你的报错上看来,这并不是数据库上的错误。

#7


你把这句话放到plsql中执行,看看可以不

#8


引用 7 楼 jdsnhan 的回复:
你把这句话放到plsql中执行,看看可以不


执行报错
消息 10739,级别 15,状态 1,第 17 行
MERGE 语句中使用的插入列列表中不能包含多部分标识符。请改用单部分标识符。

#9


引用 6 楼 xzh19870715 的回复:
你应该把这个语句连上数据库执行一下看报什么错误。
从你的报错上看来,这并不是数据库上的错误。


去掉这2句后可以执行啦,但是我需要在不符合ON后面的条件是,将T1.FLYC_Text的值设置为默认的值,此时以下语句报错,请教如何改,谢谢
WHEN NOT MATCHED THEN 

  INSERT (T1.FLYC_Text) VALUES ('');

#10


到底没有匹配到的时候是“更新为空值”?还是“设置为默认的值”???

如果像你语句里写的那样,想插入一个空值,这是没有意义的事情,插入一个空行算什么意思? 如果设置为默认值(当前前提是你设置了该字段的默认值),那么就直接:

  INSERT (FLYC_Text) VALUES (DEFAULT);

#11


引用 10 楼 minsic78 的回复:
到底没有匹配到的时候是“更新为空值”?还是“设置为默认的值”???

如果像你语句里写的那样,想插入一个空值,这是没有意义的事情,插入一个空行算什么意思? 如果设置为默认值(当前前提是你设置了该字段的默认值),那么就直接:

  INSERT (FLYC_Text) VALUES (DEFAULT);


想设置为没有匹配的设置为默认值
即为:INSERT (FLYC_Text) VALUES (正常);  这样写也会报错  

消息 10739,级别 15,状态 1,第 17 行
MERGE 语句中使用的插入列列表中不能包含多部分标识符。请改用单部分标识符。

#12


引用 11 楼 qq_21081883 的回复:
Quote: 引用 10 楼 minsic78 的回复:

到底没有匹配到的时候是“更新为空值”?还是“设置为默认的值”???

如果像你语句里写的那样,想插入一个空值,这是没有意义的事情,插入一个空行算什么意思? 如果设置为默认值(当前前提是你设置了该字段的默认值),那么就直接:

  INSERT (FLYC_Text) VALUES (DEFAULT);


想设置为没有匹配的设置为默认值
即为:INSERT (FLYC_Text) VALUES (正常);  这样写也会报错  

消息 10739,级别 15,状态 1,第 17 行
MERGE 语句中使用的插入列列表中不能包含多部分标识符。请改用单部分标识符。


INSERT (FLYC_Text) VALUES ('正常'); 

字符串要用单引号引起来

#13


试过啦,没有用,还是一样的,谢谢

#14


教你一个方法,把select简化一下,先验证merge into ... when的结构是否正确使用,

#15


Merge都没搞清楚,Insert部分你想插入什么数据?NULL。。。每一个不匹配就插入一个NULL,为了最后数有多少个?
T1没有主键且都允许为空的话可能不会报错,但是不会有这样的写法,把T4中不匹配的KEY值插入到T1中会更有意义,
Update部分和Insert部分都应该用到T4的,否则你这Merge的合理性就很值得怀疑。

你先撇开Merge分步把逻辑设计出来,再考虑是否适用于Merge吧,
隐约的感觉着你是想分两种case执行Update,没有Insert的需求